我有一些非常混乱的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页面。
答案 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.*?>
替换为单个空格或
即可。我建议用一些空格替换,否则你可能遇到一些问题,跨度互相对接。那将取决于你。
一些注意事项:
我把所有这些都写成区分大小写。如果您有<SPAN>
或class="Post"
之类的内容,则必须对案例不敏感。
我没有考虑额外的空格。所以这与<div class = "post">
不匹配。如果这是一个问题,这很容易解决。
我没有考虑使用单引号。所以这与<div class='post'>
不匹配。同样,这很容易解决。
如果你在编辑器中使用正则表达式,这将会有点棘手,因为我所知道的编辑器不允许你进行子替换。但是,在大多数编程语言中,这是可能的。如果你让我知道你正在使用什么来执行你的正则表达式,我可以使这个答案更完整。