替换PHP中包含$字符的单词

时间:2012-03-08 16:03:36

标签: php regex preg-replace

我在更换标记以$字符开头的邮件中时遇到问题。

这是我正在尝试使用的代码:

$tag = '$TAG';
$message = '..text $TAGd d$TAG $TAG text..';
$pattern = '/\b\\'.$tag.'\b/';
echo $pattern."<br/>";
echo preg_replace($pattern, "REPLACED", $message);

输出:

/\b\$TAG\b/
..text $TAGd dREPLACED $TAG text..

我希望它能替换$ TAG的最后一次出现,因为它是唯一一个没有被其他角色阻挡的人。然而,无论我尝试什么,它都会不断取代第二个。

我尝试过的一些变化: 跳过$ tag变量字符串concatination

$message = '..text $TAGd d$TAG $TAG text..';
$pattern = '/\b\$TAG\b/';
echo $pattern."<br/>";
echo preg_replace($pattern, "REPLACED", $message);

输出:

/\b\$TAG\b/
..text $TAGd dREPLACED $TAG text..

在$

之前删除反斜杠
$message = '..text $TAGd d$TAG $TAG text..';
$pattern = '/\b$TAG\b/';
echo $pattern."<br/>";
echo preg_replace($pattern, "REPLACED", $message);

输出:

/\b\$TAG\b/
..text $TAGd d$TAG $TAG text..

在$

之前添加第二个反斜杠
$message = '..text $TAGd d$TAG $TAG text..';
$pattern = '/\b\\$TAG\b/';
echo $pattern."<br/>";
echo preg_replace($pattern, "REPLACED", $message);

输出:

/\b\$TAG\b/
..text $TAGd dREPLACED $TAG text..

对于这个问题的任何帮助将不胜感激,因为我似乎无法解决我做错的事情。谢谢! :)

3 个答案:

答案 0 :(得分:1)

用美元符号反斜杠零($ \ 0)替换美元符号($)

http://forums.devshed.com/php-development-5/preg-replace-problem-with-dollar-signs-35089.html

答案 1 :(得分:1)

使用\B作为单词的开头,使用\b作为单词的结尾:

$tag = '$TAG';
$message = '..text $TAGd d$TAG $TAG text..';
$pattern = '/\B\\'.$tag.'\b/';
echo $pattern."<br/>";
echo preg_replace($pattern, "REPLACED", $message);

对我来说很好。我不确定为什么会出现这种情况,因为通常它应该只是\b - 但它确实解决了这个问题。

答案 2 :(得分:1)

您需要使用其他锚点而不是\b,因为它匹配单词\w和非单词\W章程之间的位置($不是单词字符)

也许你的表达更像是:

'/(?<!\w)' . $tag . '\b/'

但这取决于你希望它匹配的时间。