preg_match()函数在不同的服务器上提供不同的结果

时间:2018-04-04 11:14:14

标签: php validation preg-match

我首先尝试阅读其他问题,但没有找到任何有用的东西。 我正在使用 preg_match()功能进行阿联酋电话号码验证,一切都在localhost(XAMPP)上工作正常。但是当谈到生产服务器时我没有得到我期望的结果。

Php版本: 7.2 ,服务器操作系统: CentOS 7.4 (inmotion hosting)

验证的示例代码如下,

$phone="971588471481";
$pattern = "/^(?:\971|00971)?(?:50|51|52|54|55|56|58|2|3|4|6|7|9)\d{7}$/";

if(preg_match($pattern, $phone)) {
   echo "Match Result: <b>valid Phone Number</b>";
}else{
   echo "Match Result: <b>Phone number is not valid</b>";
}

当我在本地主机上运行上述代码时,结果是有效的电话号码。但是在实时服务器上,相同的脚本会产生相反的结果。(无效的电话号码)。为什么会给出不同的结果? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

在PHP7中,在执行前分析regexp效率,如果从引擎的角度来看它太复杂,可能会暂停执行。

您应该以更优化的方式编写模式,以避免在组中的同一位置匹配的许多替代方案。

您可以通过以下方式优化正则表达式:

$pattern = "/^(?:(?:00)?971)?(?:5[0124568]|[234679])\d{7}$/";

请参阅PHP online demo

<强>详情

  • ^ - 字符串开头
  • (?:(?:00)?971)? - 可选序列
    • (?:00)? - 00
    • 的可选序列
    • 971 - 971子字符串
  • (?: - 要么
    • 5[0124568] - 5后跟01245,{{1} }或6
    • 8 - 或
    • | - [234679]23467
  • 9 - 分组结束
  • ) - 7位
  • \d{7} - 字符串结尾(或$可在此处使用)/