我希望找到并替换长字符串中的单词。我想找到这样开头的单词:$ test $并将其替换为空。
我尝试了很多东西,无法弄清楚正则表达式。这是我尝试的最后一个:
preg_replace("/\b\\$(.*)\\$\b/im", '', $text);
无论我做什么,我都无法取代以美元符号开头和结尾的单词。
答案 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
:
$
不是单词字符,因此请勿使用\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; | : -