PHP正则表达式 - 两个服务器上的不同解析

4

我遇到了一个以前从未见过的问题。同样的正则表达式在两个不同的服务器上产生了两个不同的结果。

以下是代码:

preg_replace('#[^\pL0-9_@-]#iu', '', '!%&abc123_æøå');

服务器A上的结果(php 5.2.6,服务器Api:Apache 2.0 Handler):

abc123_æøå

服务器B上的结果(php 5.2.5,服务器Api:CGI/FastCGI):

123_

有没有人对为什么会出现这种差异有任何想法?


似乎是一个棘手的问题... 奇怪的行为! - Alix Axel
3个回答

2

这可能是由于以下原因:

  • 本地设置
  • PHP 多字节字符串支持开/关状态
  • PHP mb_string.func_overload(对一些函数进行多字节支持的重载)

谢谢回复 :) 我在php.ini中找不到任何这些东西,但我尝试在正则表达式之前运行setlocale(LC_ALL, 'no_NB');,但没有任何变化。如果我只对'abc123_'运行正则表达式,它仍然会产生'123_',所以也许这不是一个多字节问题? - Tommy

1
你可以尝试使用mb_eregi_replace函数。
mb_eregi_replace('[^\pL0-9_@-]', '', '!%&abc123_æøå');

应该在支持多字节字符串的所有服务器上保持一致,并且应该消除由于不同文件编码而可能出现的问题。(至少从理论上讲。)


谢谢您的回复 :) 我试过了,实际上它产生了与我原始贴子中的代码相同的结果。也许这是某种指示器。 - Tommy
有趣的。尝试打印 mb_regex_encoding。看看它们是否不同。您也可以直接在编码中硬编码。mb_regex_encoding('UTF-8');,或者您想使用的任何编码。 - Atli
感谢您的建议!我使用的编码是ISO-8859-1,但即使使用utf-8,mb_eregi_replacepreg_replace的效果也是相同的。很奇怪的事情。 - Tommy
是的,这确实表现得非常奇怪。我能想到的唯一可能是文件本身使用不同的编码(ISO vs. UTF-8),因此硬编码字符串可能由不同的字节串表示(毕竟PHP字符串只是字节数组)。也许如果你使用像Notepad++这样的工具重新编码两个文件,那么可能会有所改变... - Atli
现在还没有任何效果。虽然谢谢你们迄今为止提供的建议。我已经在大约10个不同的服务器上运行了这段代码,这是我第一次遇到这个问题。 - Tommy

0

好了,问题终于解决了。服务器已经从php 5.2.5升级到5.2.11(仍然作为cgi运行),旧版本的问题已经消失。

感谢大家的反馈和建议!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接