2013-10-08 74 views
1

我有以下字符串:解析伪XML标签数组

$input = '[gallery ids="1151,1150,1149,1148,1147" name="ponny"]'; 

我需要将其解析到一个数组,因此所需的输出应该是这样的:

$output = array(
    'ids' => '1151,1150,1149,1148,1147', 
    'name' => 'ponny' 
); 

伪标签名gallery会被忽略。

什么是在PHP中这样做的最有效的方法?

+1

也许你可以使用[BB代码分析器(http://php.net/manual/ en/book.bbcode.php),但我不知道这是否适用于多个参数。 (BBCode通常每个标签有一个参数,紧跟在标签名后面,例如[img = myimage.jpg]) – feeela

+0

我不想涉及任何外部PHP库。 – hsz

+2

你有没有效率的方式来做到这一点,你不满意? –

回答

0

我不知道它是多么有效,但你可以只是把输入转换成XML:

$input = '[gallery ids="1151,1150,1149,1148,1147" name="ponny"]'; 

$xml = str_replace(array('[', ']'), array('<', ' />'), $input); 

var_dump(new SimpleXMLElement($xml)); 
0

由于简单的解决方案,你可以报价之间提取值

$input = '[gallery ids="1151,1150,1149,1148,1147" name="ponny"]'; 
preg_match_all('/\"([^\"]*?)\"/', $input, $matches); 
$output = array(
    'ids' => $matches[1][0], 
    'name' => $matches[1][1] 
); 

var_dump($output)输出是

array (size=2) 
    'ids' => string '1151,1150,1149,1148,1147' (length=24) 
    'name' => string 'ponny' (length=5) 
0
$idsStart=strpos('ids',$input); 
$idsValueStart=strpos('"',$input,$idsStart); 
$idsValueEnd=strpos('"',$input,$idsValueStart); 
$ids=substr($input,$idsValueStart,$idsValueEnd-$idsValueStart); 
$nameStart=strpos('name',$input); 
$nameValueStart=strpos('"',$input,$nameStart); 
$nameValueEnd=strpos('"',$input,$nameValueStart); 
$name=substr($input,$nameValueStart,$nameValueEnd-$nameValueStart); 
$output=array(); 
$output[]=$ids; 
$output[]=$name; 

不是非常有效的寻找,但如果变量的画廊中的顺序数组改变它应该仍然给你正确的答案。