在PHP中查找以dollar signs $开头和结尾的单词

时间:2014-08-06 17:46:19

标签: php regex

我希望找到并替换长字符串中的单词。我想找到这样开头的单词:$ test $并将其替换为空。

我尝试了很多东西,无法弄清楚正则表达式。这是我尝试的最后一个:

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

无论我做什么,我都无法取代以美元符号开头和结尾的单词。

3 个答案:

答案 0 :(得分:4)

使用单引号而不是双引号并删除双重转义。

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

字边界\b也不消耗任何字符,它断言一边有一个字符,另一边则没有。你需要删除这个词边界才能正常工作,你的正则表达式中没有包含单词字符的东西,所以i修饰符在这里没用,你没有锚点所以删除{ {1}}(多行)修饰符。

同样m贪心运算符。因此,*将尽可能多地匹配,并仍然允许正则表达式的其余部分匹配。要明确这一点,它将替换整个字符串:

.*

我建议在此处使用non-greedy运算符$text = '$fooo$ bar $baz$ quz $foobar$'; var_dump(preg_replace('/\$(.*)\$/', '', $text)); # => string(0) "" 。一旦你指定问号,你就说明了(不要贪婪 ..一旦找到结束*? ...停止,你就完成了。)< / p>

$

修改

要解决您的问题,您可以使用匹配任何非空格字符的$text = '$fooo$ bar $baz$ quz $foobar$'; var_dump(preg_replace('/\$(.*?)\$/', '', $text)); # => string(10) " bar quz "

\S

答案 1 :(得分:3)

有三种不同的职位符合词边界\b

  1. 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  2. 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  3. 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  4. $不是单词字符,因此请勿使用\b或不起作用。此外,不需要双重转义,也不需要im修饰符:

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

    我会用:

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

答案 2 :(得分:1)

您可以使用preg_quote来帮助您引用&#39;:

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

echo $t;

来自文档:

  

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

     

特殊的正则表达式字符是:。 \ + *? [^] $(){} =! &LT; &GT; | : -