PHP preg_replace - 正则表达式不包括短语

时间:2010-02-01 08:13:39

标签: php preg-replace

$test = "<div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>";

$test = preg_replace("/<div(.*)#uniquetag#(.*)<\/div>/i", "#uniquetag#", $test);

我希望结果是

$test = "#uniquetag# <div>Keep this</div>";

但它返回

$test = "#uniquetag#";

我想我知道为什么。 (。*)贪婪,它将搜索范围扩展到最后。但我无法弄清楚做到这一点的正确方法是什么。

更新

特别感谢ghostdog74。老问题解决了。经历了一个新问题......

$test = "<div></div> <div><b><i>#uniquetag#</b></i></div> <div>Keep this</div>";

$test = preg_replace("/<div(.*)#uniquetag#(.*?)<\/div>/i", "#uniquetag#", $test);

预期结果是

$test = "<div></div> #uniquetag# <div>Keep this</div>";

但事实证明是

$test = "#uniquetag# <div>Keep this</div>";

同样,我相信这是因为第一个(。)。将其更改为(。?)也无济于事。需要考虑一种排除方式。

2 个答案:

答案 0 :(得分:3)

在大多数情况下,我强烈建议使用HTML解析器(例如this one)来获取这些链接。使用正则表达式来解析HTML将会有问题,因为HTML不是常规的,你不会考虑边缘情况的结束。

有关详细信息,请参阅here

答案 1 :(得分:3)

(.*)更改为(.*?)