2013-10-08 110 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; 

不是非常有效的尋找,但如果變量的畫廊中的順序數組改變它應該仍然給你正確的答案。