// 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
}
}
}
}
//