【问题标题】:PHP very strict complex string validation using preg_matchPHP 使用 preg_match 进行非常严格的复杂字符串验证
【发布时间】:2013-10-25 18:35:40
【问题描述】:

我正在尝试根据强加给我的以下正则表达式验证字符串:

[-,.:; 0-9A-Z&@$£¥€'"«»‘’“”?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'"«»‘’“”?!/\\()\[\]{}<>*=#%+]{0,157}

任何人都可以帮助在 PHP 中编写 preg_match 来验证输入字符串吗?我正在苦苦挣扎,因为:

  1. 一开始我对正则表达式的了解并不是很好
  2. 我在正则表达式本身中看到特殊字符,我确信 PHP 不会对我直接插入字符串感到高兴(例如 $£¥€)

徒劳地希望我只是尝试将它粘贴到preg_match,转义双引号,因此:

$ste = "Some string input";

if(preg_match("/[-,.:; 0-9A-Z&@$£¥€'\"«»‘’“”?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'\"«»‘’“”?!/\\()\[\]{}<>*=#%+]{0,157}/",$ste))
{
    echo "OK";  
}
else
{
    echo "Not OK";  
}

提前致谢!!

【问题讨论】:

  • 你已经有了你的正则表达式。那么这到底是怎么回事?
  • 那么,你想要一个可以匹配正则表达式的字符串,你不知道哪个函数?为什么?
  • 你应该启用错误报告,你会注意到你应该在你的正则表达式中转义 / 或将分隔符替换为 ~ 之类的东西。

标签: php regex validation preg-match


【解决方案1】:

你可以这样做:

if (preg_match('~^[ -"$&-),-<>?-\]{}£¥€«»‘’“”]{3}[ -\]{}£¥€«»‘’“”]{0,157}$~u', $ste))
    echo 'OK';
else
    echo 'Not OK';

我为unicode添加了“u”修饰符,并使用范围减小了字符类的大小(例如:,-&lt;表示unicode表中,&lt;之间的所有字符).

但最重要的是,我添加了锚点^$,分别表示字符串的startend

【讨论】:

    【解决方案2】:

    只要您执行以下操作,PHP 将非常满意表达式中的“特殊”字符:

    1. 确保输入字符串使用 UTF-8 编码。

    2. 确保您的 PHP 程序文件使用 UFT-8 编码保存。 (显然,您还需要在系统的所有其他部分中使用 UTF-8 编码,否则您会在沿线的某个地方出现不合时宜的字符,但这超出了本问题的范围)

    3. 将添加u 修饰符添加到正则表达式模式字符串的末尾,以告诉正则表达式解析器处理 UTF-8 字符。即:

      preg_match("/....../u", ...);
                          ^
                       add this
      

    除此之外,你已经掌握了它。

    【讨论】:

    • 我会毁了心情,在表达式的某处有这样的“”?!/\\()。现在注意表达式中的/,它也用作分隔符,这意味着它会抛出错误unknown modifier ...
    • 感谢您的非关键回答。珍惜你的时间。它是系统中的所有 UTF8 文件和编码。我尝试在最后添加 u 但它仍然无法正确识别模式:(
    • @DanielProcter:HamZa 确实有关于流氓斜线的观点;我错过了(我认为该模式已经完全逃脱了,因为它已作为既成事实提供给您,但显然不是)。最简单的解决方案是使用不在字符串中的不同分隔符。也许在表达式的开头和结尾使用~ 而不是/。 (或者你可以转义模式中的/ 字符,但如果模式已经强加给你,如果你能帮助它,最好不要改变它)
    • 谢谢你。对此,我真的非常感激。我已将分隔符更改为 ~,但仍无法按预期运行:$ste = utf8_encode("+HELLO STEVE"); if(preg_match("~[-,.:; 0-9A-Z&amp;@$£¥€'\"«»‘’“”?!/\\()\[\]{}&lt;&gt;]{3}[-,.:; 0-9A-Z&amp;@$£¥€'\"«»‘’“”?!/\\()\[\]{}&lt;&gt;*=#%+]{0,157}~u",$ste)) { echo "OK"; } else { echo "Not OK"; }
    • 注意:utf8_encode() 调用可能需要也可能不需要,具体取决于字符串的编码方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2015-06-27
    • 2016-09-06
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    相关资源
    最近更新 更多