REGEX取代所有"风格='任何'"表内除外

时间:2014-02-20 08:36:24

标签: regex

我在解析html。我知道这不应该使用正则表达式而是dom / xpath。在我的情况下,它应该是快速,简单和不整洁所以我选择了正则表达式。

该任务正在用空字符串替换所有style='xxx',但表格除外。

preg_replace的这个正则表达式可以捕获所有style='xxx',无论在哪里:

'/ style="([^"]+)"/s'

内容可能如下所示

<!-- more html here -->
<span style='do:smtg'><table class=... > <span style="...">
<table> <div style=""></div></table></span></table>
<!-- more html here -->

或只是简单的非嵌套表,这意味着正则表达式也应该在嵌套表中排除所有style='...'

这样做有简单的语法吗?

2 个答案:

答案 0 :(得分:1)

<强> Thou Shalt Not Parse HTML with Regular Expressions!


不,真的,你不应该。

正如您的示例所示,您可以期待嵌套表。这意味着正则表达式应该跟踪嵌套的级别,以决定你是否在表中。 如果你找到了一种方法,它肯定会&#34;快速而简单&#34;。

答案 1 :(得分:0)

电子邮件,恢复这个问题,因为它有一个没有提到的正则表达式。 (在为regex bounty quest进行一些研究时找到了您的问题。)

关于使用正则表达式解析html的所有免责声明,这是一种简单的方法。

首先,我们需要一个正则表达式来匹配表,嵌套与否。这可以通过简单的递归来实现:

<table(?:.*?(?R).*?|.*?)</table>

接下来,我们排除这些,并匹配我们想要的。这是整个正则表达式:

(?s)<table(?:.*?(?R).*?|.*?)<\/table>(*SKIP)(*F)|style=(['"])[^'"]*\1

请参阅demo

交替的左侧匹配完整的表,嵌套与否,然后故意失败。右侧匹配并捕获您的样式到组1,允许不同的报价样式。我们知道这些是正确的风格,因为它们与左边的表达不匹配。

使用此正则表达式,您可以执行简单的preg_replace($regex, "", $yourstring);

参考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...