Как я могу поймать недопустимый шаблон preg_match? - PullRequest
8 голосов
/ 14 сентября 2010

Я пишу скрипт PHP, который принимает шаблон регулярного выражения от пользователя, который используется preg_match (). Как я могу проверить, что шаблон действителен?

Ответы [ 6 ]

8 голосов
/ 14 сентября 2010

По документам ,

preg_match () возвращает FALSE, если произошла ошибка.

проблема в том, что он также выдаст предупреждение.

Один из способов справиться с этим - подавить вывод сообщения об ошибке, перехватить возвращаемое значение и вывести ошибку, используя error_get_last(), если оно было ложным.

Что-то вроде

$old_error = error_reporting(0); // Turn off error reporting

$match = preg_match(......);

if ($match === false) 
 {
   $error = error_get_last();
   echo $error["message"];
 }

error_reporting($old_error);  // Set error reporting to old level

Вам может не понадобиться бит сообщения об ошибках в производственной среде - это зависит от ваших настроек.

5 голосов
/ 14 сентября 2010

Просто проверьте это. preg_match() вернет FALSE, если шаблон недействителен.

Возвращаемые значения: preg_match () возвращает количество совпадений шаблона. Это будет либо 0 раз (нет совпадений) или 1 раз, потому что preg_match () будет прекратить поиск после первого совпадения. preg_match_all () наоборот будет продолжайте, пока не дойдет до конца предмет. preg_match () возвращает FALSE, если произошла ошибка.

1 голос
/ 22 ноября 2016

Вы можете использовать preg_last_error () для получения ответов. Детальная страница:

http://php.net/manual/en/function.preg-last-error.php

Спасибо!

0 голосов
/ 25 ноября 2016

Не используйте @, используйте обратную косую черту перед preg_match, чтобы выдать исключение в новых версиях PHP (5.3+?).

tr{
   if (\preg_match($regex, $variable)===false)
      echo 'Valid';
   else
      echo 'InValid';
}
catch(Exception $e) {
   echo $e->getMessage(); die;
}
0 голосов
/ 14 сентября 2010

Я думал, что видел метод для этого в MRE ; Оказывается, это был Фридл. Вот список .

0 голосов
/ 14 сентября 2010
if (preg_match($regex, $variable)) {
    echo 'Valid';
}
else {
    echo 'InValid';
}
...