gpt4 book ai didi

php - PHP Preg 引擎中的错误 : look-around Unicode issue

转载 作者:可可西里 更新时间:2023-11-01 12:55:46 26 4
gpt4 key购买 nike

为什么后面js码字:

"آرد@".replace(/(?=.)/g,'!'); // returns: ""!آ!ر!د""

但它的 php 等价物返回 '!��!��!��!��!��!��'?

preg_replace('/(?=.)/u', '!', 'آرد'); //returns '!�!�!�!�!�!�'

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

参见:http://3v4l.org/jrV0W

最佳答案

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

  1. 自 PHP 5.1 起,您可以使用 \p{L} 可以翻译为:“是来自任何语言的任何类型的字母。”
  2. 除了标准符号外,\p{L}、Java、Perl、PCRE 和现在的 PHP 都允许您使用简写 \pL。速记仅适用于单字母 Unicode 属性。

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

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

无论您对文档编码做什么,都需要使用 Unicode character properties让这个工作。

那个奇怪的符号呢?

当您看到“内部带有问号的怪异方形符号”(也称为替换字符)时,这通常表明您的字节在 80-FF (128-255) 范围内,系统是尝试以 UTF-8 呈现它。

整个字节范围对于 UTF-8 中的单字节字符是无效的,但在诸如 ISO-8859-1 的西方编码中都很常见。

关于php - PHP Preg 引擎中的错误 : look-around Unicode issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14931192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com