Heim  >  Artikel  >  Backend-Entwicklung  >  正则表达式 - 为什么在正则不加模式修正符的时候,PHP去匹配的中文字符会是乱码的

正则表达式 - 为什么在正则不加模式修正符的时候,PHP去匹配的中文字符会是乱码的

WBOY
WBOYOriginal
2016-06-06 20:46:191285Durchsuche

正则表达式 - 为什么在正则不加模式修正符的时候,PHP去匹配的中文字符会是乱码的
情况如下:

  • php 5.5.11
  • mac osx 10.9.2、win7、centOS 6.3

代码如下:

<code>echo preg_replace('/[\s-]+/', '-', '阿树')."\n";
</code>

测试结果如下:

  • Mac 乱码
  • windows、linux都正常

增加模式修正符后正常,如下:

<code>echo preg_replace('/[\s-]+/u', '-', '阿树')."\n";
</code>

查找资料,是这么说的:

u(PCRE_UTF8)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

请问:

  1. u的意思就是将匹配的字符当作utf8吗,还有其他作用吗
  2. 我的代码是utf8,但是为什么只有mac(Unix)会乱码呢?

回复内容:

正则表达式 - 为什么在正则不加模式修正符的时候,PHP去匹配的中文字符会是乱码的
情况如下:

  • php 5.5.11
  • mac osx 10.9.2、win7、centOS 6.3

代码如下:

<code>echo preg_replace('/[\s-]+/', '-', '阿树')."\n";
</code>

测试结果如下:

  • Mac 乱码
  • windows、linux都正常

增加模式修正符后正常,如下:

<code>echo preg_replace('/[\s-]+/u', '-', '阿树')."\n";
</code>

查找资料,是这么说的:

u(PCRE_UTF8)

此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

请问:

  1. u的意思就是将匹配的字符当作utf8吗,还有其他作用吗
  2. 我的代码是utf8,但是为什么只有mac(Unix)会乱码呢?

树的utf8表示是e6 a0 91。敏感的话看到这里就应该明白了。

第二个字节a0\n是一样的,从而被替换成了-,剩下左右两边的两个字节变成非法ASCII,显示成问号了,至于平台差异性,估计是所谓PCRE的问题吧,有兴趣可以钻进去查查

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn