2 votes

preg_match un "shortcode" pour créer un tableau avec des clés de tableau sémantique

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"/]

2voto

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
)

1voto

ghostdog74 Points 86060
$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);

0voto

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']));

-1voto

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%
        )

)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X