PHP 8.1 的 preg_replace 函数与双下引号结合使用时会表现出奇怪的行为。
这是一个简短的示例,显示了问题:
<?php
#this does not work
$bearbeitet = "Hallo „Pivot text";
$bearbeitet = preg_replace("/[\W][Pp][Ii][Vv][Oo][Tt][\W]/", " <span class='abbrv' title='Performance Programm'>PIVOT</span> ", $bearbeitet);
echo $bearbeitet;
?>
如果您运行此代码,它会在替换的文本前面放置一个奇怪的符号,从而破坏我的脚本。如果您有任何其他符号而不是双下引号,它就可以正常工作:
<?php
#this works
$bearbeitet = "Hallo (Pivot text";
$bearbeitet = preg_replace("/[\W][Pp][Ii][Vv][Oo][Tt][\W]/", " <span class='abbrv' title='Performance Programm'>PIVOT</span> ", $bearbeitet);
echo $bearbeitet;
?>
我遗漏了什么还是 PHP 中的错误?
正如 @jhnc 评论的那样,您的模式缺少
u
正则表达式标志,该标志指定您的字符串可能包含 unicode 字符。它将完全解决问题。
来自 regex101
:模式字符串将被视为 UTF-16,这意味着 unicode 字符也将包含在 [a-z] 范围以及 \w 等转义序列中。u
现在函数生成替换字符
�
的原因是因为您期望在 P
之前有一个非单词字符。但由于正则表达式引擎正在寻找 ascii(1 字节)字符,因此它只会考虑 „
字符的最后一个字节(„
在 utf-8 中是 E2 80 9E
,最后一个字节是 9E
) ,它本身不是有效的 ascii 字符,因此将输出替换而不是引发异常。