我正在寻找并替换长字符串中的单词。我想找到开头像这样的单词:$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
:
- 如果第一个字符是单词,则放在字符串的第一个字符之前。
- 如果最后一个字符是单词字符,则在字符串的最后一个字符之后。
- 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
$
不是一个单词字符,所以不要使用'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 '