我在制作以下代码以输出我期望的内容时遇到了一些麻烦:
<?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>
代码。
在我的正则表达式中,我正在进行贪婪的匹配(.*)
,但我也尝试使用(.*?)
,它会输出相同的结果。
我逃避了每个特殊角色。特殊正则表达式字符为:. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
。
答案 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 >