2010-04-16 2 views
9

Что такое эффективный способ проверки того, содержит ли имя пользователя несколько специальных символов, которые я определяю.Проверка специальных символов PHP

Примеры:% # ^. ! @ &() +/"` ~ <> {} [] | = -;?.

Мне нужно, чтобы обнаружить их и возвращают логическое значение, а не просто лишить их

Вероятно супер простой вопрос, но Мне нужен лучший способ сделать это, чем огромный список условных выражений или неаккуратный цикл.

ответ

9

Чем лучше, чтобы определить, есть ли какие-либо символы, которые не в списке разрешенных, как:

preg_match('![^a-z0-9]!i', $nickname); 
+3

+1: Белые списки - лучший инструмент безопасности, чем черные списки. –

+0

Спасибо! Извините мою неопытность с помощью регулярных выражений, но как я могу также разрешить подчеркивание? – pws5068

+0

просто добавьте _ after char '9' – zerkms

3

С регулярными выражениями специальные символы \ w означают «любые словальные символы», а символы \ d означают цифры. Значок^в скобках означает отрицать или в основном что-либо, что не находится в скобках. В приведенном ниже коде будет отображаться «true» или «1», чтобы указать, что строка содержит в нем символы, отличные от слова.

$string = '% #^. ! @ & () +/" ? ` ~ < > { } [ ] | = - ;' 
echo preg_match('~[^\w\d]~', $string); 
+0

пытаясь быть кулаком - вы забыли, что строки ограничиваются кавычками ;-) – zerkms

+0

Да, я поймал это. ;) –

3

Regex, как правило, путь для тестирования допустимого диапазона, в частности, буквенно-цифровые объекты, такие как имена пользователей. Однако, если множество недопустимых символов мало и/или непоследовательный (то есть, не так легко определены с диапазонами), вы можете получить более высокую производительность с этим:

strspn($string,'%#^[email protected]&()+/"?`~<>{}[]|=-'); 

Возвращает длину первого подстроки найдено который состоит только из запрещенных символов (который будет равен 0, если не указаны запрещенные символы).

2

Вы можете использовать что-то вроде следующего, чтобы подсчитать, сколько раз символ из заданного набора символов появляется в строке:

<?php 

/** 
* Count the number of times any char from $char is found in $search 
* @param $search Looks for the chars here 
* @param $chars The chars to look for 
* @return int 
*/ 
function countChars($search, $chars) 
{ 
    $chars = str_replace(
     array("\\", '[', ']', '^', '-'), 
     array("\\\\", '\[', '\]', '\^', '\-'), $chars); 

    $results = array(); 
    preg_match_all("/[$chars]/", $search, $results, PREG_SET_ORDER); 
    return count($results); 
} 

var_dump(countChars("Hello, World", "ol")); 
var_dump(countChars("Lorem ipsum...", ".m")); // searches for . and m only 
var_dump(countChars("^[]-^\\*", "^[]-\\")); 

Надежда, что помогает.

Смежные вопросы