Comment faire pour que le morceau de "shortcode" suivant soit preg_matché de façon à ce que video et align soient des clés de tableau et que leurs valeurs soient celles entre guillemets ? [video="123456" align="left"/]
Réponses
Trop de publicités?
Alix Axel
Points
63455
Voici une autre approche utilisant 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()
sortie de $arr
:
Array
(
[123456] => left
[123457] => right
)
ghostdog74
Points
86060
Charles
Points
40
Solution alternative avec des paramètres nommés :
$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";
Vous pouvez également réutiliser la solution précédente de array_combine donnée par Alix :
print_r(array_combine($matches['video'], $matches['align']));
Max Shawabkeh
Points
19030
Je ne pense pas qu'il y ait un moyen (simple) de le faire en utilisant une seule regex, mais cela fonctionnera de manière assez générale, en sélectionnant les balises et en les analysant :
$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>';
Sortie :
Array
(
[0] => Array
(
[video] => 123456
[align] => left
)
[1] => Array
(
[audio] => 123456
[volume] => 50%
)
)