正则表达式:匹配所有不正确的标记属性

时间:2010-07-12 07:49:32

标签: php regex

输入的示例:

<a href="abc" something=b foo="bar" baz=cool>

我想要匹配:

something=b
baz=cool

然而,即使使用preg_match_all,我最终得到的所有内容都只匹配第一个(某些= b)。我正在使用的正则表达式是:

<\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 个答案:

答案 0 :(得分:3)

使用TidyHTMLPurifier等库为您修复损坏的HTML。

答案 1 :(得分:0)

在你的正则表达式<\w+.*?(\w+=[^"|^'|^>]).*?>中,\w+=[^"|^'|^>]部分没有按照您的想法执行 - 您正在混合character classesalternation with pipe character

如果属性值可以包含>=个字符,编写一个能够捕获给定XMLish标记内所有格式错误的属性的正则表达式会很棘手。

例如:

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

你的正则表达式试图在一个步骤中从整个字符串中提取所有属性 - 它会查找<tag,然后在某个地方找到一个不带引号的属性。这样,您只能匹配一个属性,第一个属性。

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

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

如果它们也可以包含空格,那么你需要更多的前瞻:

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

答案 2 :(得分:0)

首先,插入符“^”符号否定整个字符类。字符类具有隐含或语句,这是字符类的重点,因此您的类可以缩短为[^'“&gt;]

现在,为什么你只获得“something = b”标签,我相信你在角色课后错过了一个+。

因此,我对我的修改的正则表达式将是:

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

注意组结尾后的空格

答案 3 :(得分:0)

<\w+
(?:
  \s+
  (?:
    \w+="[^"]*"
    |(\w+=[^\s>]+)
  )
)+
\s*/?>

您可以使用#delimiter和x修饰符尝试此操作。我已将其格式化,因此更具可读性。

答案 4 :(得分:0)

如果您知道标签外没有任何=符号,则可以使用此正则表达式:

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

在此example中,它匹配所有不正确的属性

编辑:

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

这也匹配class2中的<div class=class2/>