1

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

因为 PHP 要求模式被包裹在一个字符之间,所以我想这样做:

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

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

    $mods = substr($rpos, strlen($string));
    
  4. 查明此列表中是否有任何无效修饰符。如果有返回 false,否则正则表达式似乎是有效的。

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

4

2 回答 2

2

我总是在 Symfony2 Finder 组件中使用这个函数:

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!
    }
}
于 2013-03-26T19:59:03.087 回答
1

在 commets 中已经以简短的方式描述了它。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";
}
于 2013-03-26T20:07:04.440 回答