由PHP preg_replace阻碍

时间:2012-08-20 11:26:37

标签: php regex preg-replace

出现以下preg_replace问题:

$subject = '<div class="main"> <div class="block_bc"> <a href="index.php?x_param=11" class="BC-1"> Gallery</a> / <a href="path/Title_Item/?x_param=17" class="BC-2"> Title Item</a> / <span class="BC-3"> Bridge</span> </div> </div>';
$regex = '/(<div\sclass=\"block_bc\"[^>]*>)([^<\/div>]*>)(<\/div>)/is';   
$replacement = '<div class="block_bc"></div>';
preg_replace($regex, $replacement, $subject);

基本上,我希望最终得到<div class="main"> <div class="block_bc"></div> </div>,但它没有被选中。

有谁能请我指出“明显的”错误?

3 个答案:

答案 0 :(得分:1)

您尝试使用错误的字符类([])。 [^<\/div>]*部分表示除以下某项之外的字符数:</div,{{ 1}}。这可能不是你的意思。

您可以使用的是non-greedy repeat

>

另外,使用regexp从html中解决问题可能会非常脆弱,请尝试使用带有xpath的DOM。对于格式错误的输入,它更加冗长,但也更具弹性:

$regex = '/(<div\s*class=\"block_bc\"[^>]*>)(.+?)(<\/div>)/is';

答案 1 :(得分:0)

模式

~<div\sclass="block_bc"[^>]*>.*</div>~isU

将一直有效,直到你在“block_bc”中添加一些div。

答案 2 :(得分:0)

[^&lt; / div&gt;]只创建一个没有'&lt;','/','d','i','v'和'&gt;'的字符类。它没有做你想象的那样。使用非贪婪的任何匹配替换中间部分应该可以解决问题:

'/(<div\sclass=\"block_bc\"[^>]*>)(.*?)(<\/div>)/is'