Как я могу проверить регулярное выражение?

Я хотел бы проверить правильность регулярного выражения в PHP, желательно до его использования. Единственный способ сделать это на самом деле пытается preg_match() и видеть, возвращает ли он FALSE ?

Существует ли более простой / правильный способ проверки правильного регулярного выражения?

 // This is valid, both opening ( and closing ) var_dump(preg_match('~Valid(Regular)Expression~', null) === false); // This is invalid, no opening ( for the closing ) var_dump(preg_match('~InvalidRegular)Expression~', null) === false); 

Как сказал пользователь pozs , также рассмотрите возможность размещения @ перед preg_match () ( @preg_match() ) в тестовой среде для предотвращения предупреждений или уведомлений.

Чтобы проверить RegExp, просто запустите его против null (нет необходимости знать данные, которые вы хотите протестировать против upfront) . Если он возвращает явное ложное ( === false ), оно сломается. В противном случае он действителен, хотя ему ничего не нужно.

Поэтому нет необходимости писать собственный валидатор RegExp. Это потрачено впустую …

Я создал простую функцию, которую можно вызвать для проверки preg

 function is_preg_error() { $errors = array( PREG_NO_ERROR => 'Code 0 : No errors', PREG_INTERNAL_ERROR => 'Code 1 : There was an internal PCRE error', PREG_BACKTRACK_LIMIT_ERROR => 'Code 2 : Backtrack limit was exhausted', PREG_RECURSION_LIMIT_ERROR => 'Code 3 : Recursion limit was exhausted', PREG_BAD_UTF8_ERROR => 'Code 4 : The offset didn\'t correspond to the begin of a valid UTF-8 code point', PREG_BAD_UTF8_OFFSET_ERROR => 'Code 5 : Malformed UTF-8 data', ); return $errors[preg_last_error()]; } 

Вы можете вызвать эту функцию, используя следующий код:

 preg_match('/(?:\D+|<\d+>)*[!?]/', 'foobar foobar foobar'); echo is_preg_error(); 

Альтернативный – Онлайн-тестер регулярного выражения

  • RegExr
  • Регулятор регулярных выражений PHP
  • Регулярный инструмент выражения

Если вы хотите динамически протестировать regex preg_match(...) === false кажется, ваш единственный вариант. У PHP нет механизма для компиляции регулярных выражений до их использования.

Также вы можете найти preg_last_error полезную функцию.

С другой стороны, если у вас есть регулярное выражение и просто хочу знать, действительно ли он действителен до его использования, есть множество доступных инструментов. Я нашел rubular.com приятным в использовании.

Вы можете проверить, является ли это синтаксически правильным регулярным выражением с этим кошмаром регулярного выражения, если ваш движок поддерживает рекурсию (PHP должен).

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

From: Существует ли регулярное выражение для определения правильного регулярного выражения?

 /^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/ 

Если вы не выполняете регулярное выражение, вы не можете быть уверены, что он действителен. Недавно я реализовал аналогичный RegexValidator для Zend Framework. Работает отлично.

 <?php class Nuke_Validate_RegEx extends Zend_Validate_Abstract { /** * Error constant */ const ERROR_INVALID_REGEX = 'invalidRegex'; /** * Error messages * @var array */ protected $_messageTemplates = array( self::ERROR_INVALID_REGEX => "This is a regular expression PHP cannot parse."); /** * Runs the actual validation * @param string $pattern The regular expression we are testing * @return bool */ public function isValid($pattern) { if (@preg_match($pattern, "Lorem ipsum") === false) { $this->_error(self::ERROR_INVALID_REGEX); return false; } return true; } } 

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

Примечание: «рекурсивное регулярное выражение» не является регулярным выражением, и эта расширенная версия регулярного выражения не соответствует расширенным регулярным выражениям.

Лучшим вариантом является использование preg_match и совпадение с NULL, как сказал @Claudrian

Итак, в целом, для всех, кто подходит к этому вопросу, вы можете проверять регулярные выражения на PHP с помощью такой функции.

preg_match () возвращает 1, если шаблон соответствует заданному объекту, 0, если это не так, или FALSE, если произошла ошибка. – Руководство PHP

 /** * Return an error message if the regular expression is invalid * * @param string $regex string to validate * @return string */ function invalidRegex($regex) { if(preg_match($regex, null) !== false) { return ''; } $errors = array( PREG_NO_ERROR => 'Code 0 : No errors', PREG_INTERNAL_ERROR => 'Code 1 : There was an internal PCRE error', PREG_BACKTRACK_LIMIT_ERROR => 'Code 2 : Backtrack limit was exhausted', PREG_RECURSION_LIMIT_ERROR => 'Code 3 : Recursion limit was exhausted', PREG_BAD_UTF8_ERROR => 'Code 4 : The offset didn\'t correspond to the begin of a valid UTF-8 code point', PREG_BAD_UTF8_OFFSET_ERROR => 'Code 5 : Malformed UTF-8 data', ); return $errors[preg_last_error()]; } 

Что можно использовать так.

 if($error = invalidRegex('/foo//')) { die($error); } 

Я не уверен, поддерживает ли он PCRE, но расширение Chrome распространяется по адресу https://chrome.google.com/webstore/detail/cmmblmkfaijaadfjapjddbeaoffeccib, называемому RegExp Tester . Я еще не использовал его, но я не могу ручаться за него, но, возможно, он может быть полезен?

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

Я считаю, что использование TDD – эффективный способ разработки регулярных выражений и означает, что его расширение в будущем упрощается, поскольку у вас уже есть все ваши тестовые примеры.

Ответ на этот вопрос имеет большой ответ на настройку ваших модульных тестов.

Согласно ссылке PCRE , такой способ проверки достоверности выражения до его использования не существует. Но я думаю, что если кто-то использует недопустимое выражение, это ошибка дизайна в этом приложении, а не во время выполнения, поэтому вы должны быть в порядке.