lsstarboy 发表于 2009-12-19 23:01

不同机器的preg_match_all结果不一样?[已解决,见四楼]

又遇到preg_match_all的问题,以前遇到过,后来换了php版本,貌似解决了,这次换版本也不行了,再来求救:

情况:一段代码:$content = "#测试 #abc";//utf-8编码
$count = preg_match_all('/(?:^|\s)#([\pL\pN_\-\.]{1,64})/', strtolower($content), $match);

其中“测试”是utf-8编码。一个机器上正常,新安装的机器都不正常,测试的输出为:

array(2) { =>array(2) { =>string(3) "#

bs 发表于 2009-12-21 11:41

貌似可以注意一下文件本身编码

还有mb_internal_encoding 设定

lsstarboy 发表于 2009-12-22 22:00

多谢bs版主。

你说的两个地方都检查了,都正常。

经过多次测试,发现5.2.8以上的版本都不能正常显示,5.2.8 以下的版本可以。

一楼的帖子只提到原另三台机器是pcre版本安装的不对。

另外5.2.9的版本更新说明中有一段是:提高的pcre的运行速度,会不会把这功能直接修改了?

[ 本帖最后由 lsstarboy 于 2009-12-22 22:02 编辑 ]

lsstarboy 发表于 2009-12-24 22:56

多谢各位的关注!

经过近三天的追踪,从操作系统的选择,到web服务器,再到php和pcre的版本,最终追到了源代码,终于解决了问题,总结如下:

1、linux在某些方面不严格,很多版都可以不加/u参数就能实现utf-8的preg;BSD严格执行标准。

2、php5.2.8以前版本自带的pcre也可以自动实现utf-8。

3、错误根源在于pear的Net_URL_Mapper有bug,提取regex的时候根本没有考虑到utf-8的情况,直接不加任何参数就时行preg_match。

4、把pcre的使用方法完整的读了一次,发现以前有很多地方没注意到。http://www.pcre.org/pcre.txt。学到了/u参数的另一个替代——前置(*UTF8),这个在需要生成表达式的时候很有用。

5、pear虽然不错,但是要为别人的错误负责!

6、nginx和fpm-php是一个黄金搭档!顺便说一下,php5.3.0加入了fpm的选项。

[ 本帖最后由 lsstarboy 于 2009-12-24 22:58 编辑 ]

bs 发表于 2009-12-25 01:29

lsstarboy 在问题研究上相当严谨,pf
:)

dz902 发表于 2009-12-25 13:16

本帖应该加入精华。

lsstarboy 发表于 2009-12-27 20:22

多谢bs,以后会努力。

renxiao2003 发表于 2010-01-24 17:17

又学习了。

ulovko 发表于 2012-07-12 20:51

宝贵的经验来之不易 感谢分享 ^_^ :emn31:

maochanglu 发表于 2012-07-13 10:59

实在是难得经验。
页: [1]
查看完整版本: 不同机器的preg_match_all结果不一样?[已解决,见四楼]