1

我想要这个字符串:

value="1,'goahead'" your='56' so='"<br />"'

我希望 php 正则表达式返回结果数组,如下所示:

value="1,'goahead'"
your='56'
so='"<br />"'

我试过这个正则表达式:

preg_match_all("#([\d\w_]+)\s*=\s*(\"|')([^'\"]*)(\"|')*#isx")

但它未能获取此值:value="1,'goahead'"

我认为这是因为值内的单引号。请帮助我改进模式。

4

3 回答 3

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 />"
)

工作示例:http: //3v4l.org/TIIZ2

于 2013-04-11T19:10:39.333 回答
0

使用这个正则表达式会更好:

/(\w+)\s*=\s*(["'])(.*?)\2/

这将给出第一个子模式中的属性名称,第二个中使用的引号类型,以及第三个中的属性值。

特别重要的是.*?, 懒惰匹配(即最不可能)和\2匹配第二个子模式(在这种情况下,使用的引号)。但是,这不允许使用\"or进行转义\'。这涉及更多一点。

于 2013-04-11T19:04:34.073 回答
0

我不敢问你最终会如何做到这一点,以及为什么,无论如何,这可能会对你有所帮助:

if (preg_match('%(value="\d+,(\s+)?\'[a-z]+\'"(\s+)?)?(your=\'\d+\'(\s+)?)?(so=\'"<br(\s+)?\/>"\')?%six', $subject, $matches)) { }

于 2013-04-11T19:07:21.760 回答