PHP preg_replace regex删除最后一个标记

时间:2015-12-08 22:59:37

标签: php regex

我在制作以下代码以输出我期望的内容时遇到了一些麻烦:

<?php
$a='##foobar(a b, c d)@@f()</td>a</td>';
echo preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);

预期结果应为##blah(this)@@f()</td>a,但其输出为##blah(this)@@f()a(使用phptester)。

对我来说,如何输出最后a,而不是之前的</td>标记是没有意义的。我只想删除最后一个</td>代码。

在我的正则表达式中,我正在进行贪婪的匹配(.*),但我也尝试使用(.*?),它会输出相同的结果。

我逃避了每个特殊角色。特殊正则表达式字符为:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

2 个答案:

答案 0 :(得分:2)

您的正则表达式没问题,问题是浏览器没有呈现结束标记。试试这个:

<?php
$a = '##foobar(a b, c d)@@f()</td>a</td>';
$b = preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);

echo htmlentities($b);

答案 1 :(得分:2)

您可以使用命令行在交互模式下使用PHP,而不是使用phptester

php -a

然后你输入一个交互式shell,非常类似于python。

使用该工具测试您的代码,我们可以看到您的正则表达式正常。

$ php -a
Interactive shell

php > $a='##foobar(a b, c d)@@f()</td>a</td>';
php > echo preg_replace('/foobar.*?\)(.*)\<\/td\>$/', 'blah(this)$1', $a);
##blah(this)@@f()</td>a
php >