Retourner dernière balise d'une chaine contenant de l'html

Résolu
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012 - 8 févr. 2010 à 22:56
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012 - 11 févr. 2010 à 23:51
Bonsoir,
Pour afficher une pt partie d'une news qui se trouvera dans une page d'accueil, j'aimerais récupérer la dernière balise html qu'on retrouvera après avoir raccourci à 200 caractères cette news. En fait on écrit un article par l'intermédiaire de fckeditor, et pour pouvoir raccourcir sans couper juste après une balise ouvrante, j'ai besoin d'un regex me permettant de connaitre la dernière balise. Après je testerai si oui ou non c une balise ouvrante et si oui j'ajouterai une balise fermante.
J'espère que j'ai été assez clair.

Voici le code me permettant de limiter l'article à 200 caractères.

$max = 200;
$chaine = $data['texte'];
if (strlen($chaine) >= $max) {
$chaine = substr($chaine, 0, $max);
$espace = strrpos($chaine, " ");
$chaine = substr($chaine, 0, $espace)."...";
//ici se trouvera le regex
}

Je connais relativement bien les regex mais là, c'est au dessus de mes connaissances.
J'avais trouvé la fonction php preg_match_all qui me retourne toutes les occurences dans un tableau multi dimensionnel, mais je pense qu'il y moyen d'avoir un truc plus optimisé.
Merci

6 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
11 févr. 2010 à 22:00
faut faire une assertion :

[\s\S]*<(?!(br))(\w+).*?>

Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
9 févr. 2010 à 08:25
a quoi ressemble ta source HTML ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
10 févr. 2010 à 09:06
Bonjour Renfield,
Et bien, c'est une source du type:

blablabla
blablabla


blablablablabla
ect...

En imaginant que je coupe la phrase au "blabla" entre les balise strong, je me retrouve avec une balise strong ouverte pouvant influencer le reste de ma page.
Et donc le but serait de voir que, après avoir coupé la phrase, la dernière balise de cette phrase est ouverte et donc par la suite mettre une balise fermante du même type.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 févr. 2010 à 09:45
récupérer le nom de la dernière balise ouvrante, en somme ...

[\s\S]*<(\w+).*?>

après, si tu ajoutes une fermante alors qu'elle existe déjà, ca n'est pas dramatique


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
11 févr. 2010 à 21:00
J'ai testé ton regex et il fonctionne bien à une exception près que j'ai oublié de mentionner. Des balise br (
) sont possible. J'ai essayé d'ajouter cette règle dans le regex mais je n'y suis pas arriver. Peut être pourra tu encore m'aider.

$chaine = "Je trouve incroyable qu'il ne veille pas fonctionner.

Chaque fois c la meme chose, mais je reviens tjs content qu'il
soit prêt a me recevoir


pourquoi pas en fait.

Antoine

";
preg_match("#[\s\S]*<(\w+).*?[^\b?/]>#",$chaine,$tab);// [^\b?/] essai pour br mais non concluant
echo $tab[count($tab)-1];

Merci
0
dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
11 févr. 2010 à 23:51
Excellent !!!
Merci pour ton aide.

Voici le code qui permet d'afficher une partie d'un texte, comprenant des balise html, venant du base de données sans avoir d'effet indésirable sur la suite de votre site.
Et on dit merci à qui? A Renfield ;)

$max = 200;
$chaine = $data['texte'];
if (strlen($chaine) >= $max) {
$chaine = substr($chaine, 0, $max);
$espace = strrpos($chaine, " ");
$chaine = substr($chaine, 0, $espace)."...";
}
preg_match("#[\s\S]*<(?!(br))(\w+).*?>#",$chaine,$tab);
if(count($tab)>0)
$chaine.= "</".$tab[count($tab)-1].">";
$chaine.="
";
0
Rejoignez-nous