如何一次性删除X / HTML代码中的所有空标签?

时间:2010-03-20 13:35:55

标签: html xhtml

例如: 我想删除所有突出显示的标签 alt text http://shup.com/Shup/299976/110220132930-My-Desktop.png

3 个答案:

答案 0 :(得分:1)

如果这只是关于快速编辑文件,并且你的编辑器支持正则表达式替换,你可以使用这样的正则表达式:

<[^>]+></[^>]+>

搜索此正则表达式,并替换为空字符串。

注意:这在任何方面都不安全 - 不要依赖它,因为它可以找到更多的东西而不仅仅是有效的空标签。 (例如,它也会找到<a></b>。)使用正则表达式没有安全的方法 - 但如果你手动检查每个替换,你应该没问题。如果你需要真正安全的替换,那么要么你必须找到一个支持这个的编辑器(JEdit可能是一个不错的选择,但我没有检查过),或者你必须自己解析文件 - 例如使用XSLT。

答案 1 :(得分:0)

您可以在任何支持它们的编辑器中使用正则表达式。例如,我在Dreamweaver中测试了this one

<(?!\!|input|br|img|meta|hr)[^/>]*?>[\s]*?</[^>]*?>

只需进行搜索并替换所有(将正则表达式作为搜索字符串,不作为替换)。但请注意,这可能会删除必要的空格。如果您只是想删除空标签,那么

<(?!\!|input|br|img|meta|hr)[^/>]*?></[^>]*?>

将是要走的路。

更新:您也想删除&amp; nbsps:

<(?!\!|input|br|img|meta|hr)[^/>]*?>(?:[\s]|&nbsp;)*?</[^>]*?>

我没有验证这个 - 它应该没问题,试试看: - )

答案 2 :(得分:0)

你所要求的听起来像是正则表达式的工作。许多编辑器支持正则表达式查找/替换。就个人而言,我可能会从Perl的命令行中做到这一点(sed也可以),但那只是我。

perl -pe 's|<([^\s>]+)[^>]*></\1>||g' < file.html > new_file.html

或者如果你很勇敢,请编辑文件:

perl -pe 's|<([^\s>]+)[^>]*></\1>||g' -i file.html

这将删除:

<p></p>
<p id="foo"></p>

但不是:

<p>hello world</p>
<p></a>

警告: <img src="pic.png"></img><br></br>等内容也将被删除。你的问题并不明显,但我认为这是不可取的。也许你并不担心,因为你知道你的所有图像都被声明为<img src="pic.png"/>。否则,需要修改正则表达式来解释这个问题,但我决定从简单开始做一个更简单的解释......

它的工作原理是匹配开始标记:文字<后跟标记名称(一个或多个不是空格的字符或> = [^\s>]+),任何属性(零)或更多不是> = [^>]*)的字符,然后是文字>;以及具有相同名称的结束标记:这利用了我们捕获标记名称的事实,因此我们可以使用反向引用= </\1>。然后用空字符串替换匹配。

如果您不熟悉此处使用的语法/术语,我是perlre文档页面的粉丝。其他语言中的正则表达式语法应该非常相似,如果不相同,那么即使你没有Perl,这也很有用:)

哦,还有一件事。如果您有<div><p></p></div>之类的内容,则不会同时收到这些内容。您必须执行多次传递:第一次将删除<p></p>,而第二次删除<div></div>。在Perl中,替换运算符返回所做的替换次数,因此您可以:

perl -pe '1 while s|<([^\s>]+)[^>]*></\1>||g' < file.html > new_file.html