2010-02-02 72 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'])); 
相关问题