我尝试制作正则表达式,除了指定的HTML标记之外,还删除HTML标记中的所有属性。
我有这个HTML代码:
<p class="someClass" id="someId" style="border: 1px solid black" name="someName" foo="bar"></p>
我想删除除类, id 和名称之外的所有属性,代码应如下所示:
<p class="someClass" id="someId" name="someName">Text</p>
我有这个正则表达式:
<([a-z][a-z0-9]*)(?:[^>]*(\sid=['"][^'"]*['"]))?[^>]*?(\/?)>
并使用模式
<$1$2>
它仅适用于属性 id 。如何为所有指定的属性执行此操作?
答案 0 :(得分:2)
你可以用一个负向前瞻来实现这一点,这将告诉你的表达要么1.吃一个字符,或2.匹配特殊序列,然后冲洗并重复:
<(\w+)\s*(?:(?:(?:(?!class=|id=|name=)[^>]))*((?:class|id|name)=['"][^'"]*['"]\s*)?)+>
说明:
<(\w+)\s*
(匹配标记和标记名的打开)
(?:
(开始主要构造的封闭(注意它不记得匹配))
(?:(?:(?!class=|id=|name=)[^>]))*
(向前看没有特殊的标记,然后吃一个角色,重复多次,不要忘记任何事情)
((?:class|id|name)=['"][^'"]*['"])\s*?
(前瞻失败,前方特别令牌,让我们吃掉它!注意常规,记住&#39; parens) < / p>
)+
(主要构造的结束封闭;重复它,它将为每个特殊标记匹配一次)
>
(标记结束)
如果您的正则表达式支持每组多个匹配,则this point您可能拥有所需的匹配项。例如,在.NET中,你有类似的东西:$ 1 =&#39; a&#39;,$ 2 [0] =&#39; class =&#34; someClass&#34;&#39 ;,$ 2 [1] =&#39; id =&#34; someId&#34;&#39;等
但是如果你发现只记得最后一场比赛,你可能只需要为你想要匹配的每个令牌重复主要构造,例如:(匹配将是$ 1- $ 4)
<(\w+)\s*(?:(?:(?:(?!class=|id=|name=)[^>]))*((?:class|id|name)=['"][^'"]*['"]\s*)?)(?:(?:(?:(?!class=|id=|name=)[^>]))*((?:class|id|name)=['"][^'"]*['"]\s*)?)(?:(?:(?:(?!class=|id=|name=)[^>]))*((?:class|id|name)=['"][^'"]*['"]\s*)?)[^>]*>