2010-10-04 123 views
0

我有自定義標籤[tag val=100][/tag]。我如何獲得val以及標籤之間的任何內容?Preg_Match_All:模式中的兩個值

例如:

[tag val=100]apple[/tag] 

值1 = 100
值2 =蘋果

編輯:如果我有,在標籤內的多個項目
例如:

[tag val=100 id=3] 
+0

標籤是否可以嵌套,例如'[tag val = 100] fruits:[tag2] apples [/ tag2]和pear [/ tag]'? – webbiedave 2010-10-04 20:29:54

+0

關於你的編輯:固定的可用屬性的選擇?或者你想檢查任何可能的? – poke 2010-10-04 20:31:04

+0

如果您要求*正則表達式,那麼您應該清楚*正則性*! – splash 2010-10-04 20:36:33

回答

2

如果你在你的問題這樣的一個字符串,可以使用preg_match代替preg_match_all

$str = "[tag val=100]apple[/tag]"; 

preg_match("/\[.+? val=(.+?)\](.+?)\[\/.+?\]/", $str, $matches); 

$value = $matches[1]; // "100" 
$content = $matches[2]; // "apple" 

更新:我看你可能在每一個元素多個屬性。在這種情況下,這應該有效:

// captures all attributes in one group, and the value in another group 
preg_match("/\[.+?((?:\s+.+?=.+?)+)\](.+?)\[\/.+?\]/", $str, $matches); 

$attributes = $matches[1]; 
$content = $matches[2]; 

// split attributes into multiple "key=value" pairs 
$param_pairs = preg_split("/\s+/", $attributes, -1, PREG_SPLIT_NO_EMPTY); 
// create dictionary of attributes 
$params = array(); 
foreach ($param_pairs as $pair) { 
    $key_value = explode("=", $pair); 
    $params[$key_value[0]] = $key_value[1]; 
} 
+0

非常感謝你! – Zebra 2010-10-04 20:48:19

+0

感謝您的更新! – Zebra 2010-10-05 07:15:06

+0

您可以稍微調整RE以限制可用於屬性名稱和值的字符。我已經使用'。+?',但是你可以把它改成'[A-Za-z] +?'或類似的東西。 – 2010-10-05 12:50:06

1

這將是正則表達式爲:

'#\[tag val=([0-9]+)\]([a-zA-Z]+)\[\/tag])#' 

Val是一個數字,你的'apple'可以是一個或多個字母字符的出現。如果您想匹配更多字符,請將[a-zA-Z]+替換爲.+?