2010-10-04 82 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]+替换为.+?