【问题标题】:How to find out if a string is a PHP regex? [duplicate]如何确定一个字符串是否是 PHP 正则表达式? [复制]
【发布时间】:2013-03-26 19:51:44
【问题描述】:

有没有办法做到这一点,而不使用 @preg_match 上的错误控制运算符? :)

因为 PHP 要求字符之间包含模式,所以我想这样做:

  1. 获取第一个字符。
  2. 查找该字符在字符串中的最后一次出现:

    $rpos = strrpos($string, $string[0]);
    
  3. 获取修饰符列表:

    $mods = substr($rpos, strlen($string));
    
  4. Find out if there are any invalid modifiers in this list。如果有则返回 false,否则正则表达式似乎有效。

这个解决方案的可靠性如何?还有更好的吗?

【问题讨论】:

  • 你能给出一个失败的例子字符串吗?
  • 您可以使用带有选项 FILTER_VALIDATE_REGEXP 的 filter_var()
  • AnnaK: /(/ 会通过您的测试,但不是有效的正则表达式,因为它包含不匹配的括号。还要记住,一些正则表达式可能是有效的,但会消耗不合理的时间或内存来运行。
  • FILTER_VALIDATE_REGEXP 真的有效吗?
  • 否,FILTER_VALIDATE_REGEXP = "根据正则表达式验证值,Perl 兼容的正则表达式。"。除非建议使用 filter_var 方法在 Wouter J 的答案中使用正则表达式。

标签: php regex validation


【解决方案1】:

我总是在 Symfony2 Finder 组件中使用this function

if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
    $start = substr($m[1], 0, 1);
    $end   = substr($m[1], -1);

    if (($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start)) || ($start === '{' && $end === '}')) {
        // It's a regex!
    }
}

【讨论】:

  • nice:D 我认为这和我建议的一样,但也会检查最少字符
【解决方案2】:

在评论中已经简短地描述了它。 但是您可以使用filter_var 方法检查正则表达式是否正常

$string = "String to match";

if (filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" =>  "/abc/")))) {
    echo "Regex is OK";
} else {
    echo "Regex not okay";
}

【讨论】:

  • Warning: filter_var() [function.filter-var]: 'regexp' option missing in...
  • PHP 的第二部分是要使用的代码。我第一次使用的 filter_var 设置仅适用于其他过滤器(如 FILTER_VALIDATE_INT)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 2010-10-04
  • 2013-09-14
  • 2011-02-17
  • 2013-08-01
相关资源
最近更新 更多