我首先尝试阅读其他问题,但没有找到任何有用的东西。 我正在使用 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>";
}
当我在本地主机上运行上述代码时,结果是有效的电话号码。但是在实时服务器上,相同的脚本会产生相反的结果。(无效的电话号码)。为什么会给出不同的结果? 提前谢谢。
答案 0 :(得分:0)
在PHP7中,在执行前分析regexp效率,如果从引擎的角度来看它太复杂,可能会暂停执行。
您应该以更优化的方式编写模式,以避免在组中的同一位置匹配的许多替代方案。
您可以通过以下方式优化正则表达式:
$pattern = "/^(?:(?:00)?971)?(?:5[0124568]|[234679])\d{7}$/";
请参阅PHP online demo。
<强>详情
^
- 字符串开头(?:(?:00)?971)?
- 可选序列
(?:00)?
- 00
971
- 971
子字符串(?:
- 要么
5[0124568]
- 5
后跟0
,1
,2
,4
,5
,{{1} }或6
8
- 或|
- [234679]
,2
,3
,4
,6
或7
9
- 分组结束)
- 7位\d{7}
- 字符串结尾(或$
可在此处使用)/