Тест специальных символов PHP

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

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

Мне нужно обнаружить их и вернуть логическое значение, а не просто удалить их.

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


person pws5068    schedule 16.04.2010    source источник


Ответы (4)


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

preg_match('![^a-z0-9]!i', $nickname);
person zerkms    schedule 16.04.2010
comment
Спасибо! Извините за мою неопытность с регулярными выражениями, но как я могу также разрешить символы подчеркивания? - person pws5068; 16.04.2010

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

$string = '% # ^ . ! @ & ( ) + / " ? ` ~ < > { } [ ] | = - ;'
echo preg_match('~[^\w\d]~', $string);
person John Conde    schedule 16.04.2010
comment
пытаешься быть первым - ты забыл, что строки ограничиваются кавычками ;-) - person zerkms; 16.04.2010

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

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

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

person Duncan    schedule 16.04.2010

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

<?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("^[]-^\\*", "^[]-\\"));

Надеюсь, это поможет.

person icio    schedule 16.04.2010