【问题标题】:How to validate a regex with PHP如何使用 PHP 验证正则表达式
【发布时间】:2012-04-20 08:19:18
【问题描述】:

我希望能够验证用户输入的正则表达式,以检查它是否有效。我发现的第一件事是使用 PHP 的 filter_varFILTER_VALIDATE_REGEXP 常量,但这并没有达到我想要的效果,因为它必须将正则表达式传递给选项,但我没有针对任何东西进行正则表达式,所以基本上它只是检查正则表达式有效性。

但你明白了,我如何验证用户输入的正则表达式(不匹配)。

验证示例,简单来说:

$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

【问题讨论】:

  • 你能更明确地说一下that matches against nothing 的意思吗?它是一个空字符串?
  • 我的意思是没有变量,我没有传递任何东西来验证用户的正则表达式。
  • 很抱歉再次提出这个问题,但如果你是not passing anything to validate against the user's regex,你如何验证正则表达式?你在问题中说你不想检查有效性,那么你到底想检查正则表达式是什么?
  • @pinouchon:OP 想要验证给定字符串是否是有效的 PCRE 模式(即:验证分隔符、转义序列、匹配组等)。

标签: php regex validation


【解决方案1】:

这是一个想法 (demo):

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

preg_match() 返回模式匹配的次数。那将是 0 次(不匹配)或 1 次,因为 preg_match() 将停止 在第一场比赛之后搜索。

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

要了解模式无效的原因,请使用preg_last_error

【讨论】:

    【解决方案2】:

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

    但是你确实意识到确实没有无效的正则表达式。正则表达式是基于性能的。它要么匹配,要么不匹配,这取决于测试的主题——即使表达式或其结果看似毫无意义。

    换句话说,你只能测试一个正则表达式的有效语法……这几乎可以是任何东西!

    【讨论】:

    • 当然有一个无效的正则表达式。以“不完整的群体结构”为例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多