首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Preg engine中的错误:查看Unicode问题

PHP Preg engine中的错误:查看Unicode问题
EN

Stack Overflow用户
提问于 2013-02-18 15:13:15
回答 2查看 314关注 0票数 7

为什么要使用下面的js代码:

代码语言:javascript
复制
"آرد@".replace(/(?=.)/g,'!'); // returns: ""!آ!ر!د""

但是它的php等效项返回'!�!�!�!�!�!�'

代码语言:javascript
复制
preg_replace('/(?=.)/u', '!', 'آرد'); //returns '!�!�!�!�!�!�'

这仅适用于4.3.5 - 5.0.5、5.1.1 - 5.1.6版本。

请参阅:http://3v4l.org/jrV0W

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 20:57:37

在测试了一些字符串之后,我认为PREG引擎中有一个bug。前三行输出如预期,但第四行有故障。

代码语言:javascript
复制
<?php
echo preg_replace('/./'       , '#', 'آرد')   . PHP_EOL; //✓
echo preg_replace('/./u'      , '#', 'آرد')   . PHP_EOL; //✓
echo preg_replace('/(?=.)/'   , '#', 'آرد')   . PHP_EOL; //✓
echo preg_replace('/(?=.)/u'  , '#', 'آرد')   . PHP_EOL; //✗
echo preg_replace('/(?=\pL)/' , '#', 'آرد')   . PHP_EOL; //?
echo preg_replace('/(?=\pL)/u', '#', 'آرد')   . PHP_EOL; //?

输出:

代码语言:javascript
复制
######
###
#�#�#�#�#�#�
#�#�#�#�#�#�
#آ#ر#د
#آ#ر#د
票数 1
EN

Stack Overflow用户

发布于 2013-02-18 16:25:41

如果您只需添加/u修饰符,则该模式将被视为utf-8。第二个示例之所以有效,是因为:

从PHP5.1开始,您可以使用\p{L},它可以被翻译为:“是来自任何

  • 的任何类型的字母,\p{L},\p{L},Perl,PCRE和现在的允许您使用速记\pL。速记只适用于单字母Unicode属性。

更新:为什么选择preg_replace('/(?=.)/u', '!', 'آرد'); //returns '!�!�!�!�!�!�'??

正如@MarkFox所说,原因是因为在preg_replace()的上下文中,它假设每个字符一个字节,而您"RegExing“的字符是多字节的。这就是为什么您的替换输出具有两倍于您预期的匹配,它匹配每个字符的每个字节(我推断为两个字节)-

无论您如何处理文档编码,都需要使用Unicode character properties才能正常工作。

那个奇怪的符号是怎么回事?

当你看到“奇怪的方块符号里面有一个问号”,或者被称为替换字符,这通常是一个指示器,你有一个字节在80-FF (128-255)的范围内,系统正在尝试以UTF-8呈现它。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14931192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档