如何使用正则表达式删除其类的整个HTML标记(及其内容)?

时间:2008-10-22 16:26:52

标签: html regex perl filter

我对正则表达不是很好,但我正在学习。

我想通过类名删除一些html标记。这就是我到目前为止所做的:

<div class="footer".*?>(.*?)</div>

第一个。*?是因为它可能包含其他属性,第二个可能包含其他html内容。

我做错了什么?我尝试了很多但没有成功。

更新

在DIV中,它可以包含多行,我正在玩Perl正则表达式。

8 个答案:

答案 0 :(得分:17)

正如其他人所说,使用正则表达式处理HTML是非常棘手的,而DOM方法可能会更好。 E.g:

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder::XPath->new;
$tree->parse_file( 'yourdocument.html' );

for my $node ( $tree->findnodes( '//*[@class="footer"]' ) ) {
    $node->replace_with_content;   # delete element, but not the children
}

print $tree->as_HTML;

答案 1 :(得分:14)

您还希望在div标签之前允许其他内容

<div[^>]*class="footer"[^>]*>(.*?)</div>

此外,不区分大小写。您可能需要转义引号之类的内容或结束标记中的斜杠。你在做什么背景?

另请注意,使用正则表达式进行HTML解析可能会非常讨厌,具体取决于输入。在下面的答案中提出了一个很好的观点 - 假设你有一个类似的结构:

<div>
    <div class="footer">
        <div>Hi!</div>
    </div>
</div>

尝试为此构建正则表达式是一种灾难。最好的办法是将文档加载到DOM中,并对其进行操作。

应该紧密映射到XML :: DOM的伪代码:

document = //load document
divs = document.getElementsByTagName("div");
for(div in divs) {
    if(div.getAttributes["class"] == "footer") {
        parent = div.getParent();
        for(child in div.getChildren()) {
            // filter attribute types?
            parent.insertBefore(div, child);
        }
        parent.removeChild(div);
    }
}

<小时/> 这是一个perl库HTML::DOM,另一个是XML::DOM .NET有内置的库来处理dom解析。

答案 2 :(得分:1)

在Perl中,您需要/s修饰符,否则点将与换行符不匹配。

也就是说,使用适当的HTML或XML解析器来删除HTML文件中不需要的部分更为合适。

答案 3 :(得分:1)

<div[^>]*class="footer"[^>]*>(.*?)</div>

为我工作,但需要在特殊字符之前使用反斜杠

<div[^>]*class=\"footer\"[^>]*>(.*?)<\/div>

答案 4 :(得分:0)

部分取决于您使用的确切正则表达式引擎 - 哪种语言等。但有一种可能性是您需要转义引号和/或正斜杠。您可能还希望使其不区分大小写。

<div class=\"footer\".*?>(.*?)<\/div>

否则请说出您正在使用的语言/平台 - .NET,java,perl ...

答案 5 :(得分:0)

试试这个:

<([^\s]+).*?class="footer".*?>([.\n]*?)</([^\s]+)>

你最大的问题是嵌套标签。例如:

<div class="footer"><b></b></div>

给出的正则表达式将匹配</b>中的所有内容,最后留下</div>悬空。您将不得不假设您要查找的标记没有嵌套元素,或者您需要使用某种从HTML到DOM的解析器和XPath查询来删除整个子树。

答案 6 :(得分:0)

由于正则表达式的贪婪,这将是棘手的(请注意,我的示例可能特定于perl,但我知道贪婪是RE的一般问题。)第二个{{ 1}}会在.*?之前尽可能匹配,所以如果你有以下内容:

</div>

表达式将匹配:

<div class="SomethingElse"><div class="footer"> stuff </div></div>

这不太可能是你想要的。

答案 7 :(得分:-3)

为什么不<div class="footer".*?</div>我也不是正则表达式大师,但我认为你不需要为你的open div标签指定最后一个括号