删除HTML标记中的所有属性,但使用正则表达式

时间:2016-03-10 21:38:01

标签: html regex

我尝试制作正则表达式,除了指定的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 。如何为所有指定的属性执行此操作?

1 个答案:

答案 0 :(得分:2)

你可以用一个负向前瞻来实现这一点,这将告诉你的表达要么1.吃一个字符,或2.匹配特殊序列,然后冲洗并重复:

<(\w+)\s*(?:(?:(?:(?!class=|id=|name=)[^>]))*((?:class|id|name)=['"][^'"]*['"]\s*)?)+>

说明:

  1. <(\w+)\s* (匹配标记和标记名的打开)

  2. (?: (开始主要构造的封闭(注意它不记得匹配))

  3. (?:(?:(?!class=|id=|name=)[^>]))* (向前看没有特殊的标记,然后吃一个角色,重复多次,不要忘记任何事情)

  4. ((?:class|id|name)=['"][^'"]*['"])\s*? (前瞻失败,前方特别令牌,让我们吃掉它!注意常规,记住&#39; parens) < / p>

  5. )+ (主要构造的结束封闭;重复它,它将为每个特殊标记匹配一次)

  6. > (标记结束)

  7. 如果您的正则表达式支持每组多个匹配,则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*)?)[^>]*>
    

    see it in action here)。

相关问题