Что является эффективным способом проверить, содержит ли имя пользователя много специальных символов, которые я определяю.
Примеры: % # ^.! и () + / "? '~ <> {} [] | =-;
Я должен обнаружить их и возвратить булевскую переменную, не просто разделить их.
Вероятно, супер легкий вопрос, но мне нужен лучший способ сделать это, чем огромный список условных выражений или неаккуратного цикла.
Лучше определить, есть ли какие-либо символы, не входящие в разрешенный список, например:
preg_match('![^a-z0-9]!i', $nickname);
Вы можете использовать что-то вроде следующего, чтобы подсчитать, сколько раз символ из заданного набора символов появляется в строке:
<?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("^[]-^\\*", "^[]-\\"));
Надеюсь, что это поможет .
В регулярных выражениях специальные символы \ w означают «любые символы слова», а \ d - цифры. Знак ^ в скобках означает отрицание или что-то, чего нет в скобках. В приведенном ниже коде будет отображаться "истина" или 1, чтобы указать, что в строке есть символы, отличные от слов.
$string = '% # ^ . ! @ & ( ) + / " ? ` ~ < > { } [ ] | = - ;'
echo preg_match('~[^\w\d]~', $string);
Регулярное выражение обычно является способом тестирования разрешенного диапазона, особенно буквенно-цифровых объектов, таких как имена пользователей. Однако, если набор запрещенных символов невелик и / или не является последовательным (то есть его нелегко указать с помощью диапазонов), вы можете повысить производительность следующим образом:
strspn($string,'%#^.!@&()+/"?`~<>{}[]|=-');
Это возвращает длину первой найденной подстроки, состоящей из только запрещенные символы (который будет равен 0, если запрещенных символов нет).