gpt4 book ai didi

替换字符串中的字符代码 8217 时出现 PHP 意外输出

转载 作者:行者123 更新时间:2023-12-04 01:40:20 25 4
gpt4 key购买 nike

我遇到了意外的字符替换问题。字符编码为8217, .

我试过用斜杠转义字符,但没有任何区别。

php > $a = preg_replace('/([.,\'"’:?!])<\/a>/', '</a>\1', 'letter">Evolution’</a> </li>');
php > echo($a);
// => letter">Evolution/a> </li>

// Just to show that it works if the character is different
php > $a = preg_replace('/([.,\'"’:?!])<\/a>/', '</a>\1', 'letter">Evolution"</a> </li>');
php > echo($a);
letter">Evolution</a>" </li>

我希望它能输出

letter">Evolution</a>’ </li>

代替

letter">Evolution/a> </li>

最佳答案

默认情况下,pcre(php 正则表达式引擎)将您的模式视为一连串的单字节编码字符。所以当你写 [’]您获得了一个字符类,其中三个字节对正确的单引号 (U+2019) 进行了编码,即:\xE2 , \x80 , \x99 .

换句话说,写作 "/[’]/"在这种默认模式下就像写 "/[\xE2\x80\x99]/""/[\x80\xE2\x99]/""/[\x99\xE2\x80]/"等等,正则表达式引擎看不到代表字符 的字节序列但只有三个字节。

这就是你得到奇怪结果的原因,因为[.,\'"’:?!]只会匹配 的最后一个字节所以\x99 .

要解决此问题,您必须强制正则表达式引擎将您的模式读取为 UTF-8 编码字符串。您可以通过以下其中一种方式做到这一点:

  • preg_replace('~(*UTF)([.,\'"’:?!])</a>~', '</a>\1', 'letter">Evolution’</a> </li>');
  • preg_replace('~([.,\'"’:?!])</a>~u', '</a>\1', 'letter">Evolution’</a> </li>');

这次是三个字节 \xE2\x80\x99被视为字符 的原子序列.

通知:(*UTF)仅用于读取模式,但 u修饰符做更多的事情:它将速记字符类(如 \s\w\d)扩展为 unicode 字符,并检查主题字符串是否为 utf-8 编码。

关于替换字符串中的字符代码 8217 时出现 PHP 意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57729025/

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