我将如何 preg_match 以下“短代码”,以便 video 和 align 是数组键,它们的值是引号中的值? [视频=“123456”对齐=“左”/]
问问题
2682 次
4 回答
2
这是另一种使用方法array_combine()
:
$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()
输出$arr
:
Array
(
[123456] => left
[123457] => right
)
于 2010-02-02T04:20:29.117 回答
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);
于 2010-02-02T04:10:25.190 回答
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";
您还可以重用 Alix 提供的先前 array_combine 解决方案:
print_r(array_combine($matches['video'], $matches['align']));
于 2010-02-03T21:35:22.147 回答
-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%
)
)
于 2010-02-02T04:17:35.870 回答