2013-04-11 73 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)) { }