Как я могу проверить регулярное выражение?
Я хотел бы проверить правильность регулярного выражения в PHP, предпочтительно перед его использованием. Это единственный способ сделать это на самом деле попытка preg_match() и посмотреть, если он возвращает FALSE?
есть ли более простой / правильный способ проверить допустимое регулярное выражение?
10 ответов:
// 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()) в тестовой среде для предотвращения предупреждений или уведомлений.чтобы проверить регулярное выражение, просто запустите его против
null(нет необходимости знать данные, которые вы хотите проверить против авансом). Если он возвращает явное значение false (=== false), она сломана. В противном случае он действителен, хотя он не должен совпадать что угодно.поэтому нет необходимости писать свой собственный валидатор регулярных выражений.это впустую потраченное время...
Я создал простую функцию, которая может быть вызвана для проверки 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();
Альтернатива-Регулярное Выражение Онлайн Тестер
Если вы хотите динамически проверить регулярное выражение
preg_match(...) === falseкажется, это ваш единственный вариант. PHP не имеет механизма компиляции регулярных выражений до их использования.можно найти preg_last_error полезные функции.
С другой стороны, если у вас есть регулярное выражение и просто хотите знать, если это действительно, прежде чем использовать его есть куча инструментов, доступных там. Я нашел rubular.com быть приятным в использовании.
вы можете проверить, является ли это синтаксически правильным регулярным выражением с этим кошмаром регулярного выражения, если ваш движок поддерживает рекурсию (PHP должен).
вы не можете, однако алгоритмически сказать, если он даст результаты, которые вы хотите, не запустив его.
от: есть ли регулярное выражение для обнаружения допустимого регулярного выражения?
/^((?:(?:[^?+*{}()[\]\|]+|\.|\[(?:\^?\.|\^[^\]|[^\^])(?:[^\]\]+|\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?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 сказал
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 позвал Тестер Регулярных Выражений. Я сам еще не пользовался им, так что не могу за него поручиться, но, может быть, оно пригодится?
Я был бы склонен установить ряд модульных тестов для вашего регулярного выражения. Таким образом, вы не только сможете убедиться, что регулярное выражение действительно допустимо, но и эффективно при сопоставлении.
Я считаю, что использование TDD является эффективным способом разработки регулярного выражения и означает, что его расширение в будущем упрощается, поскольку у вас уже есть все доступные тестовые случаи.
ответ этот вопрос имеет отличный ответ на создание модульных тестов.
по словам ссылка PCRE, нет такого способа проверить правильность выражения,до Он используется. Но я думаю, что если кто-то использует недопустимое выражение, это ошибка дизайна в этом приложении, а не во время выполнения, поэтому вы должны быть в порядке.
Comments