无法用preg_replace()中的其他内容替换`$\`

ozxc1zmp  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(349)

我正在调查,但我无法找到解决办法。
这样做的目的是替换角色 $_ 从一根带着别的东西的绳子。如果将美元符号从 $search 变量,它可以工作(但不是以一种理想的方式)。
它不起作用,因为美元符号是一个特殊的字符,但我找不到如何摆脱它。
这就是我所拥有的:

$search = '$_'; // replace to '_' OR '[$_]' it returs "$1" instead of "1"
$replace = 1;
$regex = '#".*?"(*SKIP)(*FAIL)|\b' . $search . '\b#s';

$fullInput = '"$_" $_';

$r = preg_replace([$regex], $replace, $fullInput);

echo $r . PHP_EOL;

// Output with current code : "$_" $_
// Output with '_' or '[$_]': "$_" $1
//
// Expected result: "$_" 1

要考虑到,如果文本位于引号之间,则不应替换。

e5nszbig

e5nszbig1#

您可以使用此正则表达式进行搜索:

"[^\\"]*(?:\\.|[^\\"]*)*"(*SKIP)(*F)|\$_

并将其替换为 [$0] 以前的模式 | 匹配双引号字符串,允许中间有转义引号。模式后 | 比赛 $_ .
正则表达式演示
正则表达式详细信息: "[^\\"]*(?:\\.|[^\\"]*)*" :匹配双引号字符串。我们允许在此匹配中使用转义字符。 (*SKIP)(*F) :跳过并失败此匹配 | :或 \$_ :匹配文本 $_ 代码:

$search = '$_';
$replace = '[$0]';
$regex = '/"[^\\"]*(?:\\.|[^\\"]*)*"(*SKIP)(*F)|' . preg_quote($search, '/') . '/';
$fullInput = '"$_" $_';
$r = preg_replace($regex, $replace, $fullInput);
echo $r . PHP_EOL;

输出:

"$_" [$_]

相关问题