如何使用PHP验证正则表达式


How to validate a regex with PHP

我希望能够验证用户输入的正则表达式,以检查它是否有效。我在PHP的filter_var中发现的第一件事是FILTER_VALIDATE_REGEXP常量,但这并不是我想要的,因为它必须向选项传递正则表达式,但我并没有针对任何内容进行正则表达式,所以基本上它只是检查正则表达式的有效性。

但是你知道了,我如何验证用户输入的regex(不匹配)。

验证示例,简单地说:

$user_inputted_regex = $_POST['regex']; // e.g. /([a-z]+)'..*([0-9]{2})/i
if(is_valid_regex($user_inputted_regex))
{
    // The regex was valid
}
else
{
    // The regex was invalid
}

验证示例:

/[[0-9]/i              // invalid
//(.*)/                // invalid
/(.*)-(.*)-(.*)/       // valid
/([a-z]+)-([0-9_]+)/i  // valid

这里有一个想法(演示):

function is_valid_regex($pattern)
{
    return is_int(@preg_match($pattern, ''));
}

preg_match()返回模式匹配的次数。那将是0次(无匹配)或1次,因为preg_match()将停止在第一个匹配之后进行搜索。

如果发生错误,preg_match()将返回FALSE。

要获得模式无效的原因,请使用preg_last_error

您需要编写自己的函数来验证正则表达式。您可以验证它,甚至可以判断它是否包含非法字符或错误形式,但无法测试它是否是一个工作表达式。为此,您需要创建一个解决方案。

但是,您确实意识到,实际上不存在无效的正则表达式。正则表达式是基于性能的。它要么匹配,要么不匹配,这取决于测试的主题——即使表达式或结果看起来毫无意义。

换句话说,您只能测试正则表达式的有效语法。。。这几乎可以是任何事情!