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

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

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

Я должен обнаружить их и возвратить булевскую переменную, не просто разделить их.

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

9
задан Mark Rushakoff 16 April 2010 в 07:38
поделиться

4 ответа

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

preg_match('![^a-z0-9]!i', $nickname);
9
ответ дан 4 December 2019 в 12:17
поделиться

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

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

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

2
ответ дан 4 December 2019 в 12:17
поделиться

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

$string = '% # ^ . ! @ & ( ) + / " ? ` ~ < > { } [ ] | = - ;'
echo preg_match('~[^\w\d]~', $string);
3
ответ дан 4 December 2019 в 12:17
поделиться

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

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

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

3
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: