2 votes

Supprimer l'entité HTML si elle est incomplète

J'ai un problème où j'ai affiché jusqu'à 400 caractères d'une chaîne tirée de la base de données, mais cette chaîne doit contenir des entités HTML.

Par hasard, le client a créé la chaîne de manière à ce que le 400e caractère se trouve en plein milieu d'une balise P fermante, tuant ainsi la balise, ce qui entraîne d'autres erreurs pour le code qui la suit.

Je préférerais que cette balise P fermante soit entièrement supprimée car j'ai un lien "...lire la suite" attaché à la fin qui aurait l'air plus propre s'il était attaché au paragraphe existant.

Quelle serait la meilleure approche pour couvrir tous les problèmes liés aux entités HTML ? Existe-t-il une fonction PHP qui fermerait/supprimerait automatiquement les balises HTML erronées ? Je n'ai pas besoin d'une réponse codée, une simple indication m'aiderait grandement.

Merci.

4voto

Loz Cherone ツ Points 17975

Voici un moyen simple de le faire avec DOMDocument, ce n'est pas parfait mais cela peut être intéressant :

<?php 
function html_tidy($src){
    libxml_use_internal_errors(true);
    $x = new DOMDocument;
    $x->loadHTML('<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />'.$src);
    $x->formatOutput = true;
    $ret = preg_replace('~<(?:!DOCTYPE|/?(?:html|body|head))[^>]*>\s*~i', '', $x->saveHTML());
    return trim(str_replace('<meta http-equiv="Content-Type" content="text/html;charset=utf-8">','',$ret));
}

$brokenHTML[] = "<p><span>This is some broken html</spa";
$brokenHTML[] = "<poken html</spa";
$brokenHTML[] = "<p><span>This is some broken html</spa</p>";

/*
<p><span>This is some broken html</span></p>
<poken html></poken>
<p><span>This is some broken html</span></p>
*/
foreach($brokenHTML as $test){
    echo html_tidy($test);
}

?> 

Toutefois, il convient de prendre note de ce qui suit Mike 'Pomax' Kamermans Le commentaire de l'auteur de l'article.

0voto

medBo Points 1866

Pourquoi ne pas prendre le dernier mot du paragraphe ou du contenu et le supprimer, si le mot est complet vous le supprimez, s'il n'est pas complet vous le supprimez également, et vous êtes sûr que le contenu est toujours propre, je vous montre un exemple de ce à quoi le code ressemblera :

while($row = $req->fetch(PDO::FETCH_OBJ){
  //extract 400 first characters from the content you need to show
  $extraction = substr($row->text, 0, 400);
  // find the last space in this extraction
  $last_space = strrpos($extraction, ' ');
  //take content from the first character to the last space and add (...)
  echo substr($extraction, 0, $last_space) . ' ...';
}

0voto

qpaycm Points 363

Il suffit de supprimer la dernière balise brisée et de procéder à un strip_tags

$str = "<p>this is how we do</p";
$str = substr($str, 0, strrpos($str, "<"));
$str = strip_tags($str);

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