代码之家  ›  专栏  ›  技术社区  ›  Daniel Sloof

regex:匹配所有不正确的标记属性

  •  -1
  • Daniel Sloof  · 技术社区  · 16 年前

    例如输入:

    <a href=“abc”something=b foo=“bar”baz=cool>
    < /代码> 
    
    

    我正在尝试匹配:

    something=b
    巴兹酷
    < /代码> 
    
    

    然而,我最终得到的一切只会与第一个匹配(something=b),即使使用preg_match_all。我使用的正则表达式是:

    <\w+.*?(\w+=[^“^'^>]).*?gt;
    < /代码> 
    
    

    或:

    以<开头的单词 *?#匹配属性前面的任何内容。 ( \ W+属性 = [^“^'^>]+?#继续前进,直到找到“、”或> ) *?#匹配属性之后的任何内容。 >关闭> < /代码>

    我可能在做一些非常错误的事情,对于正则表达式来说是一个很新的东西。请告知!:

    <>编辑:

    修改后的正则表达式:

    <\w+.*?\ W+=([^“\'\s>]+).*?gt;
    < /代码> 
    
    

    我希望它也符合zzz=aaa;)<a href="abc" something=b foo="bar" baz=cool>

    我正在尝试匹配:

    something=b
    baz=cool
    

    然而,我最终得到的一切只会与第一个匹配(something=b),即使使用preg_match_all。我使用的正则表达式是:

    <\w+.*?(\w+=[^"|^'|^>]).*?>
    

    或:

    <\w+ # Word starting with <
    .*?  # Anything that comes in front of the matching attribute.
    (
    \w+  # The attribute
    =
    [^"|^'|^>]+? # Keep going until we find a ", ' or >
    )
    .*? # Anything that comes after the matching attribute.
    > # Closing >
    

    我可能在做一些非常错误的事情,对于正则表达式来说是一个很新的东西。请告知!:)

    编辑:

    修订后的正则表达式:

    <\w+.*?\w+=([^"\'\s>]+).*?>
    

    我也希望它与ZZZ=AAA匹配;)

    5 回复  |  直到 14 年前
        1
  •  3
  •   Nate    14 年前

    使用类似的库 Tidy HTMLPurifier 为您修复损坏的HTML。

        2
  •  0
  •   cHao    16 年前

    对于初学者,插入符号“^”将否定整个字符类。字符类具有隐含或语句,这是字符类的要点,因此可以将类缩短为[^'“>]

    至于为什么你只得到了“something=b”标签,我相信你的角色课之后就缺少了a+。

    所以我修改的regexp是:

    <\w+.*?(\w+=[^"'>]+?) .*?>
    

    注意组结束后的空格

        3
  •  0
  •   NikiC    16 年前
    <\w+
    (?:
      \s+
      (?:
        \w+="[^"]*"
        |(\w+=[^\s>]+)
      )
    )+
    \s*/?>
    

    您可以使用分隔符和x修饰符来尝试此操作。我已经对它进行了格式化,这样它更可读。

        4
  •  0
  •   Amarghosh    16 年前

    在你的正则表达式中 <\w+.*?(\w+=[^"|^'|^>]).*?> , the \w+=[^"|^'|^>] 部分并不像你想象的那样-你在混合 character classes alternation with pipe character

    如果属性值可以具有以下特性,那么编写一个regex来捕获给定xmlish标记中所有格式错误的属性是很困难的 > = 字符。

    例如:

    <a href="asd" title=This page proves that e=MC^2>
    

    您的regex尝试在一个步骤中从整个字符串中提取所有属性-它查找 <tag 然后在后面某个地方引用了一个不带引号的属性。这样,您将只匹配一个属性,第一个属性。

    您可以在一个步骤中提取左括号和右括号的内容,然后在其中查找属性。正则表达式 <\w+\s+([^>]+?)\s*> 将为您提供属性的子字符串。在该字符串中搜索未加引号的属性。如果属性是 简单的 (因为它们不包含空格),您可以使用

    \w+=(?=[^"'])[^ ]+
    

    如果它们也可以包含空格,则需要更多的前瞻性内容:

    \w+=(?=[^"']).+?(?=\w+=|$)
    
        5
  •  0
  •   True Soft    16 年前

    如果你知道你没有 = 在标签外签名,您可以使用此regex:

    (?<=\=)([^"\'\s>]+)(?=[\s>])
    

    在这 example 它匹配所有不正确的属性

    编辑:

    (?<=\=)([^"\'\s/>]+)(?=[\s/?>])
    

    这场比赛 class2 在里面 <div class=class2/> 也。

    推荐文章