灵活的正则表达式来取出DOM的一部分

时间:2013-02-23 16:29:25

标签: php regex pcre

首先,我了解Simple HTML Dom解析器和PHP的内置解决方案,它们都没有完全按照我要求的那种工作(不是我所知)。

我正在寻找PHP的PCRE,它将在DOM中找到元素和所属内容,如果标记包含任何额外的空格,则删除它并原谅。

这是代码:

<div id="maindiv">
    <div class="unusefuldiv1">Unuseful content</div>
    <div id="unusefuldiv2">Unuseful content2</div>
    <!--  ... some content I'm after for -->
</div>

我非常渴望正则表达式模式将删除.uunusefuldiv1和#unusefuldiv2(与内容一起标记)并且(如果可能的话)足够灵活地完成工作,如果, 例如<div class="unusefuldiv1">稍有错误,有额外的空格:<div class="unusefuldiv1" >

这可能与类似

preg_replace('/<div\b[^>]*>(.*?)<\/div>/is', '', $dom_content);

除了这个模式将删除所有div,不管是某些类,id还是没有。

有没有人有解决方案?

2 个答案:

答案 0 :(得分:2)

这里没有理由不使用专用的DOM解析器:

$dom = new DOMDocument();
$dom->loadHTML($data);

$xpath = new DOMXPath($dom);

$id = 'unusefuldiv2';
$classname = 'unusefuldiv1';
$query = "//div[@id='$id']|//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]";
foreach ($xpath->query($query) as $node) {    
    $node->parentNode->removeChild($node);
}

echo $dom->saveHTML();

演示:http://eval.in/11108

答案 1 :(得分:1)

$dom_content = preg_replace( 
    '/\s*<div [^<>]*unuseful[^<>]+>.*?<\/div\s*>\s*/is', '', $dom_content );

将删除其开头标记包含单词unuseful的div(及周围的空格)。

要获得更好的正则表达式解决方案,您需要更好地描述删除div的条件。