快速模式解释

时间:2013-04-11 19:00:12

标签: php regex pattern-matching

我想要这个字符串:

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'"

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

3 个答案:

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

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

答案 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)) { }