2013-04-11 58 views
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'"

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

+1

出了什么问题'爆炸(””,$ STR)'? – 2013-04-11 19:02:02

+0

爆炸(“”,$ str)的唯一问题是它将拾取“'”“
”中的空格。 – 2013-04-11 19:03:35

+0

是的,但是当空间发现值=“1,'goahead'”时发生了什么? – Jason4Ever 2013-04-11 19:04:43

回答

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

0

你会用这个表达式更好:

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

这将在第一个子模式给属性名称,在第二个报价中使用的类型,并在第三的属性值。

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

0

我不敢问你怎么收场做到这一点,为什么,反正这可以帮助你:

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