2010-02-02 41 views

回答

1
$string='[video="123456" align="left"/]'; 
$string= preg_replace("/\/|\[|\]/","",$string); 
$s = explode(" ",$string); 
foreach ($s as $item){ 
    list($tag, $value) = explode("=",$item); 
    $array[$tag]=$value; 
} 
print_r($array); 
+0

我是PHP的新手,我試圖讓自己變得更好,這只是讓我的夜晚。非常感謝ghostdog74! – 2010-02-02 04:13:41

+0

如果這解決了您的問題,您應該通過單擊問題旁邊的複選標記來給予答案,以便對答案感興趣的其他人可以找到對您有用的內容。 – 2010-02-03 21:54:29

-1

我不認爲有任何(簡單)的方式使用單一的正則表達式來做到這一點,但是這將在一個相當普遍的工作方式,挑選出標籤和解析它們:

$s = 'abc[video="123456" align="left"/]abc[audio="123456" volume="50%"/]abc'; 

preg_match_all('~\[([^\[\]]+)/\]~is', $s, $bracketed); 
$bracketed = $bracketed[1]; 

$tags = array(); 
foreach ($bracketed as $values) { 
    preg_match_all('~(\w+)\s*=\s*"([^"]+)"~is', $values, $pairs); 
    $dict = array(); 
    for ($i = 0; $i < count($pairs[0]); $i++) { 
    $dict[$pairs[1][$i]] = $pairs[2][$i]; 
    } 

    array_push($tags, $dict); 
} 

//-----------------  

echo '<pre>'; 
print_r($tags); 
echo '</pre>'; 

輸出:

Array 
(
    [0] => Array 
     (
      [video] => 123456 
      [align] => left 
     ) 

    [1] => Array 
     (
      [audio] => 123456 
      [volume] => 50% 
     ) 

) 
1

這裏使用另一種方法:輸出的$arr

$str = '[video="123456" align="left"/][video="123457" align="right"/]'; 

preg_match_all('~\[video="(\d+?)" align="(.+?)"/\]~', $str, $matches); 

$arr = array_combine($matches[1], $matches[2]); 

print_r()

Array 
(
    [123456] => left 
    [123457] => right 
) 
0

與命名參數替代的解決方案:

$str = '[video="123456" align="left"/][video="123457" align="right"/]'; 

$matches = array(); 
preg_match_all('/\[video="(?P<video>\d+?)"\salign="(?P<align>\w+?)"\/\]/', $str, $matches); 

for ($i = 0; $i < count($matches[0]); ++ $i) 
    print "Video: ".$matches['video'][$i]." Align: ".$matches['align'][$i]."\n"; 

您也重新使用以前的array_combine小號Alix提供的解決方案:

print_r(array_combine($matches['video'], $matches['align'])); 
相關問題