Quand preg match all, mais ne replace pas forcément…

Une moulinette de code qui s'est enrayée, une requête SQL qui ne passe pas ?
ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Quand preg match all, mais ne replace pas forcément…

Messagede ph.gras » 25 Avr 2016, 19:06

Quand tu cherches la source d'une vidéo affichée sur ton site…
Code: Tout sélectionner
       if(preg_match_all('#<(?:iframe|object|video|embed)[^>]+>.*</(?:iframe|object|video|embed)>#i', $content, $embeds, PREG_SET_ORDER)) {
      foreach($embeds as $i => $embed) {
         $patterns[$i] = '#' . $embed[0] . '#i';
         preg_match('#(?:src|value)="([^"]+)"#', $embed[0], $matches[$i]);
         $replacements[$i] = '<code>' . esc_html($matches[$i][1]) . '</code>';
      }

      $content = preg_replace($patterns, $replacements, $content, -1, $n);
      $content .= '<code>' . esc_html(var_export($embeds, true)) . '</code> Count:' . count($matches) . ' Replacements: ' . $n;

       } else $content = $content;
       return $content;


Résultats :
Code: Tout sélectionner
array ( 0 => array ( 0 => '<iframe src="//www.dailymotion.com/embed/video/x469mwq" width="480" height="270" frameborder="0" allowfullscreen="allowfullscreen"></iframe>', ), 1 => array ( 0 => '<iframe src="https://www.youtube.com/embed/SpKgCOawNbU" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe>', ), 2 => array ( 0 => '<object width="480" height="270"><param name="movie" value="http://www.dailymotion.com/swf/x19ivz3?syndication=132352&logo=0&info=0" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="wmode" value="transparent" /><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/x19ivz3?syndication=132352&logo=0&info=0" width="480" height="270" wmode="transparent" allowfullscreen="allowfullscreen" allowscriptaccess="always" /></object>', ), 3 => array ( 0 => '<video controls width="220" height="140" poster=""><source src="http://deransart.fr/Culturisme/Les%20culturistes%20à%20la%20Foire%20de%20Paris.mp4" type="video/mp4"></video>', ), 4 => array ( 0 => '<iframe src="https://player.vimeo.com/video/140255843" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', ), ) Count:5 Replacements: 4


J'ai perdu le troisième (n°2) en route…

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2188
Inscription: 06 Sep 2008, 22:05

Re: Quand preg match all, mais ne replace pas forcément…

Messagede Galdon » 30 Avr 2016, 15:46

Tu n'utilise pas les bons outils, il faut utiliser la fonction preg_replace_callback plutôt que de procéder en 2 étapes (récupérer les match puis les remplacer un par un).

Sinon, dans ton implémentation, tu utilise preg_replace avec un pattern construit à partir d'une variable ($embed[0]), en faisant ça tu as toute les chances d'avoir des bugs, car il faut échapper le contenu de la variable (car elle peut contenir des métacaractères), en utilisant preg_quote.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol


Retourner vers PHP/MySQL



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités