为什么要使用下面的js代码:
"آرد@".replace(/(?=.)/g,'!'); // returns: ""!آ!ر!د""但是它的php等效项返回'!�!�!�!�!�!�'。
preg_replace('/(?=.)/u', '!', 'آرد'); //returns '!�!�!�!�!�!�'这仅适用于4.3.5 - 5.0.5、5.1.1 - 5.1.6版本。
发布于 2013-02-18 20:57:37
在测试了一些字符串之后,我认为PREG引擎中有一个bug。前三行输出如预期,但第四行有故障。
<?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; //?输出:
######
###
#�#�#�#�#�#�
#�#�#�#�#�#�
#آ#ر#د
#آ#ر#د发布于 2013-02-18 16:25:41
如果您只需添加/u修饰符,则该模式将被视为utf-8。第二个示例之所以有效,是因为:
从PHP5.1开始,您可以使用\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呈现它。
https://stackoverflow.com/questions/14931192
复制相似问题