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}$/";
详情
^
- 字符串开头
(?:(?:00)?971)?
- 一个可选的序列
(?:00)?
- 00
的可选序列
971
- 971
子串
(?:
- 要么
5[0124568]
-5
后接 0
、1
、2
、4
、5
、6
或 8
|
- 或
[234679]
- 2
、3
、4
、6
、7
或 9
)
- 分组结束
\d{7}
- 7 位数
$
- 字符串结尾(或者可以在此处使用 \z
)/
我尝试先阅读其他问题,但没有发现任何有用的内容。 我正在使用 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}$/";
详情
^
- 字符串开头(?:(?:00)?971)?
- 一个可选的序列(?:00)?
-00
的可选序列
971
-971
子串
(?:
- 要么5[0124568]
-5
后接0
、1
、2
、4
、5
、6
或8
|
- 或[234679]
-2
、3
、4
、6
、7
或9
)
- 分组结束\d{7}
- 7 位数$
- 字符串结尾(或者可以在此处使用\z
)/