在PHP中查找以美元符号$开头和结尾的单词


Find words starting and ending with dollar signs $ in PHP

我正在寻找并替换长字符串中的单词。我想找到开头像这样的单词:$test$,并将其替换为空。

我已经尝试了很多东西,不能弄清楚正则表达式。这是我最后一次尝试:

preg_replace("/'b''$(.*)''$'b/im", '', $text);

无论我怎么做,我都无法让它替换以美元符号开头和结尾的单词

用单引号代替双引号,并去掉双转义。

$text = preg_replace('/'$(.*?)'$/', '', $text);

同样,一个词边界'b不消耗任何字符,它断言在一边有一个词字符,而在另一边没有。您需要删除字边界才能正常工作,并且您的正则表达式中没有任何包含单词字符的内容,因此i修饰符在这里是无用的,并且您没有锚,因此也删除m(多行)修饰符。

同样*也是一个贪婪运算符。因此,.*将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。为了说明这一点,它将替换整个字符串:

$text = '$fooo$ bar $baz$ quz $foobar$';
var_dump(preg_replace('/'$(.*)'$/', '', $text));
# => string(0) ""
我建议在这里使用非贪婪操作符*?。一旦你指定了问号,你就是在声明(不要贪婪..只要你找到一个结局$…停,你完成了。
$text = '$fooo$ bar $baz$ quz $foobar$';
var_dump(preg_replace('/'$(.*?)'$/', '', $text));
# => string(10) " bar  quz "

编辑

要解决这个问题,您可以使用'S匹配任何非空白字符。

$text = '$20.00 is the $total$';
var_dump(preg_replace('/'$'S+'$/', '', $text));
# string(14) "$20.00 is the "

有三种不同的位置可以作为词边界'b:

  1. 如果第一个字符是单词,则放在字符串的第一个字符之前。
  2. 如果最后一个字符是单词字符,则在字符串的最后一个字符之后。
  3. 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

$不是一个单词字符,所以不要使用'b,否则它将不起作用。此外,不需要双转义,也不需要im修饰符:

preg_replace('/'$(.*)'$/', '', $text);

我会使用:

preg_replace('/'$[^$]+'$/', '', $text);

您可以使用preg_quote来帮助您'引用':

$t = preg_replace('/' . preg_quote('$', '/') . '.*?' . preg_quote('$', '/') . '/', '', $text);
echo $t;

From the docs:

如果您需要在某些文本中匹配一个运行时字符串,并且该字符串可能包含特殊的正则表达式字符,则此操作非常有用。

特殊正则表达式字符为:。' + * ?[^] $ () {} = !& lt;比;|: -

与你使用的词边界标记('b)相反,你实际上想要的是相反的效果('B)——你想确保在非词字符$旁边没有一个词字符。

你也不需要使用捕获括号,因为你没有在你的替换字符串中使用反向引用。

'S+表示一个或多个非空白字符——具有贪婪/占有匹配。

代码(演示):

$text = '$foo$ boo hi$$ mon$k$ey $how thi$ $baz$ bar $foobar$';
var_export(
    preg_replace(
        '/'B'$'S+'$'B/',
        '',
        $text
    )
);
输出:

' boo hi$$ mon$k$ey $how thi$  bar '