我对正则表达不是很好,但我正在学习。
我想通过类名删除一些html标记。这就是我到目前为止所做的:
<div class="footer".*?>(.*?)</div>
第一个。*?是因为它可能包含其他属性,第二个可能包含其他html内容。
我做错了什么?我尝试了很多但没有成功。
在DIV中,它可以包含多行,我正在玩Perl正则表达式。
答案 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标签指定最后一个括号