我在解析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='...'
。
这样做有简单的语法吗?
答案 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);
参考