我如何validation正则expression式?

我想在PHP中testing正则expression式的有效性,最好在使用之前。 是唯一的方法来做到这一点实际上尝试一个preg_match() ,看看它是否返回FALSE

有一个更简单/正确的方法来testing一个有效的正则expression式吗?

 // 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用户所说,在testing环境中,也可以考虑将@放在preg_match()@ preg_match @preg_match() )之前,以防止警告或通知。

要validationRegExp,只需针对null运行它 (不需要知道要预先testing的数据) 。 如果它返回明确的错误( === false ),它被破坏。 否则它是有效的,虽然它不需要匹配任何东西。

所以没有必要编写自己的RegExpvalidation器。 浪费时间了

我创build了一个可以调用来检查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(); 

另类 – 正则expression式在线testing器

  • RegExr
  • PHP正则expression式testing器
  • 正则expression式工具

如果你想dynamictesting一个正则expression式preg_match(...) === false似乎是你唯一的select。 PHP在使用前没有编译正则expression式的机制。

你也可能会发现preg_last_error一个有用的function。

另一方面,如果你有一个正则expression式,只是想知道它是否有效之前使用它有一堆工具可用。 我发现rubular.com使用起来很愉快。

如果你的引擎支持recursion(PHP应该),你可以检查这是否是一个语法正确的正则expression式与这个正则expression式的噩梦。

但是,不能通过algorithm来判断是否会在不运行的情况下提供您想要的结果。

来自: 有正则expression式来检测有效的正则expression式吗?

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

如果没有真正执行正则expression式,你无法确定它是否有效。 我最近为Zend Framework实现了一个类似的RegexValidator。 工作得很好。

 <?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; } } 

您可以使用正则expression式validation正则expression式,达到一定的限制 。 检查此堆栈溢出答案的更多信息。

注意:“recursion正则expression式”不是一个正则expression式,这个正则expression式的扩展版本不匹配扩展正则expression式。

@Claudrian 说,更好的select是使用preg_match并匹配NULL

总而言之,对于所有出现这个问题的人来说,你可以用PHP这样的函数来validation正则expression式。

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,但在https://chrome.google.com/webstore/detail/cmmblmkfaijaadfjapjddbeaoffeccib上有一个名为RegExptesting器的Chrome扩展。; 我还没有使用它自己,所以我不能担保,但也许它可能是有用的?

我会倾向于为你的正则expression式设置一些unit testing。 这样,您不但可以确保正则expression式确实有效,而且在匹配时也是有效的。

我发现使用TDD是一种开发正则expression式的有效方法,并且意味着在将来可以使用所有的testing用例的情况下,将来扩展它就变得简单了。

这个问题的答案在设置unit testing方面有很好的答案。

根据PCRE参考文献 ,在使用expression式之前 ,没有这种方法来testingexpression式的有效性。 但是我认为,如果有人使用无效expression式,那是应用程序中的devise错误,而不是运行时错误,所以你应该没问题。