PHP 的 preg_replace 是否有错误?

问题描述 投票:0回答:1

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 中的错误?

php regex
1个回答
0
投票

正如 @jhnc 评论的那样,您的模式缺少

u
正则表达式标志,该标志指定您的字符串可能包含 unicode 字符。它将完全解决问题。

来自 regex101

u
:模式字符串将被视为 UTF-16,这意味着 unicode 字符也将包含在 [a-z] 范围以及 \w 等转义序列中。

现在函数生成替换字符

的原因是因为您期望在
P
之前有一个非单词字符。但由于正则表达式引擎正在寻找 ascii(1 字节)字符,因此它只会考虑
字符的最后一个字节(
在 utf-8 中是
E2 80 9E
,最后一个字节是
9E
) ,它本身不是有效的 ascii 字符,因此将输出替换而不是引发异常。

© www.soinside.com 2019 - 2024. All rights reserved.