如何使用RegEx去除div中的某些标记

时间:2013-11-28 19:23:58

标签: html regex

我有一些非常混乱的HTML,有几个<span>标签,我想摆脱它。有些是关闭的,有些则不是。有时候标记中会有randon换行符。正如我所说,凌乱。

示例:

<div class="post">
<span style="color: #007700">!</span>
<span style="color: #0000BB">defineLOW1</span>
<span style="color: #007700">$</span><span style="color: #0000BB">0
<br /></span><span style="color: #007700">!</span>
<span style="color: #0000BB">deinfeHIGH1</span><span style="color: #007700">$</span>
<span style="color: #0000BB">1
<br /></span>
<span style="color: #007700">!</span>
<span style="color: #0000BB">defineLOW2</span><span style="color: #007700">$</span><span style="color: #0000BB">2
<br /></span>
<span style="color: #007700">!</span>
<span style="color: #0000BB">deinfeHIGH2</span><span style="color: #007700">$</span><span style="color: #0000BB">3
</div>

我正在寻找的方法是删除类<span>的div中的所有</span>post标记,因为我想在脚本上运行脚本一堆静态HTML页面。

1 个答案:

答案 0 :(得分:0)

正如人们很快指出的那样,regular expressions cannot completely parse HTML。这并不意味着您无法使用正则表达式对HTML进行有用的操作。在您的情况下,特别是因为您的HTML格式错误,并且您的任务非常简单,您将能够使用正则表达式完成您想要的任务。但是,可能会有一些边缘情况,所以我鼓励您在完成真正清理时通过HTML验证器运行HTML。

如果你有嵌套的<div>元素,那么可能导致很多问题的一件事就是。 (我们不会担心嵌套的<span>元素,因为我们只是将它们全部删除。)这是正则表达式的一般问题。如果你使用这个匹配:

<div class="post">[^]*</div>

注意:[^]空的否定字符类,旨在匹配所有内容,包括换行符。相比之下,点元字符与换行符不匹配,这就是我们不使用它的原因。这可能不适用于所有正则表达式实现,正如波希米亚在下面的评论中指出的那样。我知道它适用于.NET和JavaScript。如果它在您的实施中不起作用,您可以使用clunkier (?:.|\n)[\s\S]

在您拥有此HTML之前,这将正常工作:

<div class="post">
    <span>Some text in a span.</span>
    <div>
      <span>Some more text in a span.</span>
    </div>
    <span>Whoops!  I'll get missed....</span>
</div>

最后<span>不会包含在您的匹配中,因为它会与开头的div匹配,然后是它的第一个结束</div>标记...这实际上是内部div的一部分

所以,如果你继续这样做,你就会遇到一个更加复杂的问题,而且你必须实现一些更复杂的东西(就像一个真正的HTML解析器,因为你的HTML生病了会有复杂性-formed)。

继续,我们假设您没有<div>嵌套在<div class="post">内。你的第一个正则表达式将匹配整个div:

<div .*\bclass="post".*>(.*)</div>

那将获得你想要的所有div。我不知道你正在使用的正则表达式的语言或风格,但大多数支持某种嵌套替换。你要做的是在第一个匹配的组(在div内部)进行第二次替换。那一个会非常简单。只需将<span\b.*?>替换为单个空格或&nbsp;即可。我建议用一些空格替换,否则你可能遇到一些问题,跨度互相对接。那将取决于你。

一些注意事项:

  • 我把所有这些都写成区分大小写。如果您有<SPAN>class="Post"之类的内容,则必须对案例不敏感。

  • 我没有考虑额外的空格。所以这与<div class = "post">不匹配。如果这是一个问题,这很容易解决。

  • 我没有考虑使用单引号。所以这与<div class='post'>不匹配。同样,这很容易解决。

如果你在编辑器中使用正则表达式,这将会有点棘手,因为我所知道的编辑器不允许你进行子替换。但是,在大多数编程语言中,这是可能的。如果你让我知道你正在使用什么来执行你的正则表达式,我可以使这个答案更完整。