preg_match() 函数在不同的服务器上给出不同的结果

preg_match() function gives different results on different servers

我尝试先阅读其他问题,但没有发现任何有用的内容。 我正在使用 preg_match() 函数进行阿联酋 phone 号码验证,在本地主机 (XAMPP) 上一切正常。但是当涉及到生产服务器没有得到我期望的结果。

Php 版本: 7.2, 服务器 OS: CentOS 7.4 (inmotion托管)

验证示例代码如下,

$phone="971588471481";
$pattern = "/^(?:1|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>";
}

当我在本地主机上 运行 以上代码时,结果是 valid phone number。但是在实时服务器上,相同的脚本会给出相反的结果。(无效Phone 数字)。为什么它给出不同的结果? 提前致谢。

在PHP7中,在执行前分析正则表达式效率,如果从引擎的角度来看太复杂,可能会停止执行。

您应该以更优化的方式编写您的模式,以避免在组中的同一位置出现太多可以匹配的备选方案。

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

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

参见PHP online demo

详情

  • ^ - 字符串开头
  • (?:(?:00)?971)? - 一个可选的序列
    • (?:00)? - 00
    • 的可选序列
    • 971 - 971 子串
  • (?: - 要么
    • 5[0124568] -5 后接 0124568
    • | - 或
    • [234679] - 234679
  • ) - 分组结束
  • \d{7} - 7 位数
  • $ - 字符串结尾(或者可以在此处使用 \z)/