Как работает preg_match? - PullRequest
       25

Как работает preg_match?

2 голосов
/ 25 января 2010

Я написал простую функцию для проверки того, должна ли отправляемая строка «быть» верной или нет.

// this works without problems
function validate_email ($value) {
    return preg_match ("/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/", $value);

}

// this doesn't work
function validate_string ($value) {
    return preg_match ("([^<>?=/\]+)", $value);

}

первая функция работает хорошо, если я отправляю электронное письмо на validate_email IЯ использовал для сохранения в силе, верните мне 1 или 0, если нет.

validate_string должен делать то же самое со строками любого вида, но без ? = < > / \.Если я проверяю функцию, она возвращает мне 1 в любом случае, почему?

validate_string ("tonino"); // return 1 ok
validate_string ("ton\ino\"); // return 1 why?
validate_string ("ton?asd=3"); // return 1 why?

символ ^ внутри ([^<>?=/]+) должен означать не символы после (или нет?)

Ответы [ 4 ]

4 голосов
/ 25 января 2010

Вы не сопоставляете начало (^) и конец ($) строки. Таким образом, "ton?asd=3" соответствует, потому что шаблон соответствует t (а остальная часть строки не имеет значения).

1 голос
/ 25 января 2010

В вашем коде несколько ошибок. Кроме того, "ton\ino\" не является допустимой строкой и [^<>?=/\]+ не является допустимым регулярным выражением, возможно, у вас есть некоторое логическое недопонимание.

Ваше регулярное выражение [^<>?=/\\]+ (здесь исправлено) будет соответствовать, если есть хотя бы один символ, который не <, >, ?, =, / и \. Поэтому, если есть хотя бы один такой символ, preg_match возвращает 1. ton\ino" и ton?asd=3 содержат как минимум один такой символ (в обоих случаях совпадение ton).

Исправление для этого заключается в использовании утверждений для начала и конца строки (^ и $), чтобы разрешить только допустимые символы для всей строки:

^[^<>?=/\\]+$

Или использовать класс положительных символов [<>?=/\\]+ для сопоставления с недопустимыми символами и отрицания возвращаемого выражения preg_match:

function validate_string ($value) {
    return !preg_match("([<>?=/\\\\]+)", $value);
}

Но было бы лучше использовать белый, а не черный список.

0 голосов
/ 12 января 2015
function validate_string ($value) {
    return !preg_match('#[<>?=/\\\\]#', $value);
}
0 голосов
/ 25 января 2010

\ является метасимволом, вам нужно убежать от него. Так было бы

return preg_match ("([^<>?=/\\\\]+)", $value);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...