【问题标题】:PHP's filter_var() Function Generating WarningPHP 的 filter_var() 函数生成警告
【发布时间】:2009-09-09 18:49:17
【问题描述】:

有人知道为什么下面的 filter_var() 函数会产生警告吗?一个字符类可以有多少个字符?

$regex = "/^[\w\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\072\073\074\075\076\077\100\133\134\135\136\140\173\174\175\176]*$/";

$string = "abc";

if(!filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp"=>$regex))))
{
    echo "dirty";
}

else
{
    echo "clean";
}

警告:filter_var() [function.filter-var]: Unknown modifier ':'

【问题讨论】:

    标签: php


    【解决方案1】:

    PHP 将您的正则表达式解释为以下字符串:

    string '/^[\w!"#$%&'()*+,-./:;<=>?@[\]^`{|}~]*$/' (length=40)
    

    (在 $regex 上使用var_dump,你会明白的)

    就在你的正则表达式的中间,所以,有一个斜线;当您使用斜线来分隔正则表达式(它是$regex 的第一个字符)时,PHP 认为中间的这个斜线标志着正则表达式的结束。

    所以,PHP 认为你的正则表达式实际上是:

    /^[\w!"#$%&'()*+,-./
    

    结尾斜杠之后的每个字符都被解释为modifiers

    而且 ':' 不是有效的修饰符。

    您可能想转义正则表达式中间的斜线;-)
    以及其他一些角色,顺便说一句...

    解决方案可能是使用preg_quote 函数。

    【讨论】:

    • 感谢您的帮助。它现在可以工作了,因为我使用它的 ASII 代码“134”添加了反斜杠。我将把当前的正则表达式放在下面的另一个答案中。
    • 不客气 :-) 我想到了一个问题:为什么你使用 ASCII 码,而不是直接使用字符?这样会更容易理解你的正则表达式,你不觉得吗?
    • 我确实在大约三秒钟前考虑过这个问题,哈哈!答案是我之前在正则表达式中使用了空格字符的 ANCII 代码,从那以后我告诉我对特殊字符执行此操作。有一天我可能会改变我的方式:)
    • OK ^^ 我明白了一点,现在^^
    【解决方案2】:

    这是当前工作的正则表达式:

    /^[\w\041\042\043\044\045\046\047\050\051\052\053\054\134\055\056\134\057\072\073\074\075\076\077\100\133\134\134\134\135\134\136\140\173\174\175\176]*$/i
    

    【讨论】:

      猜你喜欢
      • 2013-01-27
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 2021-10-04
      相关资源
      最近更新 更多