输入的示例:
<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;)
答案 0 :(得分:3)
使用Tidy或HTMLPurifier等库为您修复损坏的HTML。
答案 1 :(得分:0)
在你的正则表达式<\w+.*?(\w+=[^"|^'|^>]).*?>
中,\w+=[^"|^'|^>]
部分没有按照您的想法执行 - 您正在混合character classes和alternation 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/>
。