我想要这个字符串:
value="1,'goahead'" your='56' so='"<br />"'
我希望php regex返回结果数组如下:
value="1,'goahead'"
your='56'
so='"<br />"'
我试过这个正则表达式:
preg_match_all("#([\d\w_]+)\s*=\s*(\"|')([^'\"]*)(\"|')*#isx")
但无法获取此值:value="1,'goahead'"
我认为这是因为价值中的单引号。请帮我改进模式。
答案 0 :(得分:1)
我建议查看DOMDocument:
如果您的输入是完整标记...
<p value="1,'goahead'" your='56' so='"<br />"'>
...然后你可以这样做:
$DOM = new DOMDocument;
$DOM->loadHTML($str);
foreach ($DOM->getElementsByTagName('p')->item(0)->attributes as $attr) {
$attributes[$attr->nodeName] = $attr->nodeValue;
}
这为您提供了您正在寻找的阵列:
Array
(
[value] => 1,'goahead'
[your] => 56
[so] => "<br />"
)
答案 1 :(得分:0)
使用此正则表达式会更好:
/(\w+)\s*=\s*(["'])(.*?)\2/
这将在第一个子模式中给出属性名称,在第二个子模式中使用引用的类型,在第三个子模式中给出属性值。
特别重要的是.*?
,它与懒惰(即最小可能)匹配,而\2
与第二个子模式匹配(在本例中为使用的引用)。但是,这不允许使用\"
或\'
进行转义。这有点多了。
答案 2 :(得分:0)
我不敢问你最终是怎么做到这一点的,为什么,无论如何,这可能会对你有所帮助:
if (preg_match('%(value="\d+,(\s+)?\'[a-z]+\'"(\s+)?)?(your=\'\d+\'(\s+)?)?(so=\'"<br(\s+)?\/>"\')?%six', $subject, $matches)) { }