// on vire les balises et ce qu'il y a entre les deux pour ne garder que les liens // on pourra ensuite traiter ensemble les url avec et sans balises // (?:) permet de matcher sans capturer, donc de retirer des choses // pour la variable $tolere, on met: // \w = [a-zA-Z0-9_], espace ' ', tabulation \t, CR et LF \r\n, // /, @, %, deux-points ';', virgule ',' et point-virgule ; // et devant être échappés: . # ( ) ] { } ? ! | et le tiret qui est placé au début ou la fin $tolere = '\w\s\t\n\r/,;:éèàçù€\#@%\.\(\)[\]\{\}\?\!\|-'; $pattern = '#(?:[' . $tolere . ']+)#'; $chaine = preg_replace($pattern, '$2', $chaine); //echo($chaine . "\n"); // on met les balises $pattern = '#' . $regexListeNonGeree . '#'; $remplacement = '$0'; $chaine = preg_replace($pattern, $remplacement, $chaine); // c'est quoi cette merde? // l'API DOM de PHP bien sur!! pour manipuler le "document object model" // c'est du complètement calqué sur le javascript, avec une syntaxe PHP // et en plus elle est super vieille, elle ne connaît pas les balises HTML5 ! // mais une balise c'est une balise donc ça marche quand même // https://www.php.net/manual/fr/book.dom.php $dom = new DOMDocument; // pour ne pas s'arrêter sur les erreurs à cause des "nouvelles" balises libxml_use_internal_errors(true); if($dom->loadHTML($chaine)) // et non load() tout court qui sert à charger du XML { //
// détecter
// puis extraire le lien et supprimer les balises autour if(preg_match("#
#", $chaine)) { $nbFigures = $dom->getElementsByTagName('figure')->length; $j = 0; for($i = 0; $i < $nbFigures ; $i++) // boucle foreach impossible, une
disparaît à chaque tour { $balisesFigure = $dom->getElementsByTagName('figure'); $figure = $balisesFigure->item($j); // l'item 1 devient 0 au deuxième passage, etc $parent = $figure->parentNode; if($figure->getAttribute("class") == 'media') { $oembed = $figure->getElementsByTagName('oembed'); // tableau d'une seule case $div = $figure->getElementsByTagName('div'); // tableau d'une seule case if($oembed->length > 0) // si taille = 0, c'est que la balise figure contient autre chose qu'une oembed { $lien = $oembed->item(0)->getAttribute('url') . ' '; // un espace pour ne pas coller deux adresses $span = $dom->createElement('span', $lien); $class = $dom->createAttribute('class'); $class->value = 'media_embed'; $span->appendChild($class); $parent->replaceChild($span, $figure); } elseif($div->length > 0) // cette div créée par le ckeditor contient notre lien, plus bas se trouve une iframe { $lien = $div->item(0)->getAttribute('data-oembed-url') . ' '; $span = $dom->createElement('span', $lien); $class = $dom->createAttribute('class'); $class->value = 'media_embed'; $span->appendChild($class); $parent->replaceChild($span, $figure); } else { $j++; // la balise
n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini } } } } // #", $chaine)) { $nbIframes = $dom->getElementsByTagName('iframe')->length; for($i = 0; $i < $nbIframes ; $i++) { $balisesIframe = $dom->getElementsByTagName('iframe'); $iframe = $balisesIframe->item(0); $parent = $iframe->parentNode; $lien = $iframe->getAttribute('src') . ' '; $span = $dom->createElement('span', $lien); $class = $dom->createAttribute('class'); $class->value = 'media_embed'; $span->appendChild($class); $parent->replaceChild($span, $$iframe); } } // // pour tout les sites multimedia, remplacer les balises par les liens nus // en effet, en revenant dans l'éditeur les liens ne déclenchent pas automatiquement "l'embarquement" // cliquer à la fin d'un lien et passer à la ligne a pour effet de créer des balises // ça pose un problème parce que la bibliothèque "embera" ne gère pas les liens dans des balises if(preg_match("#.*#", $chaine)) { $nbA = $dom->getElementsByTagName('a')->length; $j = 0; for($i = 0; $i < $nbA ; $i++) { $balisesA = $dom->getElementsByTagName('a'); $a = $balisesA->item($j); $parent = $a->parentNode; $lien = $a->getAttribute('href') . ' '; // seules les liens pointant vers une des adresses de la liste sont concernés if(preg_match("#" . $listeMedia . "#", $lien)) { $span = $dom->createElement('span', $lien); $class = $dom->createAttribute('class'); $class->value = 'media_embed'; $span->appendChild($class); $parent->replaceChild($span, $a); } else { $j++; // la balise n'est pas supprimée, on incrémente l'indice du tableau pour ne pas boucler à l'infini } } } // pour nettoyer tous les warnings qu'on vient de produire et purifier nos fichiers log libxml_clear_errors(); // pour au contraire pouvoir les regarder, remplacer la ligne au dessus par celles en dessous //~ $errors = libxml_get_errors(); //~ var_dump($errors); // mettre à jour le DOM $chaine = $dom->saveHTML($dom); // enlever le DOCTYPE et les balises et $pattern = array ('##', '##', '##'); $remplacement = array ('', '', ''); $chaine = preg_replace($pattern, $remplacement, $chaine); } else { echo "Impossible de charger le HTML"; } // détecter soundcloud // normallement il n'y a rien à faire ici mais on sait jamais (une mise à jour du ckeditor?) if(preg_match("#soundcloud.com#", $chaine)) {} // détecter facebook (éventuellement fb.watch) // je crois que ça va être compliqué ici if(preg_match("#facebook.com|fb.watch#", $chaine)) {} return($chaine); // = $contenu } // embarquement !! function mediaEmbed($chaine) { //require("../Embera/src/Autoloader.php"); //$embera = new Embera\Embera(); //$chaine = $embera->autoEmbed($chaine); $pattern = '#(.+)#'; $remplacement = ''; $chaine = preg_replace($pattern, $remplacement, $chaine); // requête oembed //~ echo('

'); //~ print_r($embera->getUrlData([ //~ 'https://vimeo.com/374131624', //~ 'https://www.flickr.com/photos/bees/8597283706/in/photostream', //~ ])); return($chaine); // = $contenu }