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

WBOY
풀어 주다: 2016-06-06 20:46:19
원래의
1288명이 탐색했습니다.

正则表达式 - 为什么在正则不加模式修正符的时候,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的问题吧,有兴趣可以钻进去查查

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿