Retourner dernière balise d'une chaine contenant de l'html [Résolu]

Messages postés
160
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
- - Dernière réponse : dvwyns
Messages postés
160
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
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
3
Merci
faut faire une assertion :

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

Renfield - Admin CodeS-SourceS - MVP Visual Basic

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
a quoi ressemble ta source HTML ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Commenter la réponse de Renfield
Messages postés
160
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
0
Merci
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.
Commenter la réponse de dvwyns
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
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
Commenter la réponse de Renfield
Messages postés
160
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
0
Merci
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
Commenter la réponse de dvwyns
Messages postés
160
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
0
Merci
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.="
";
Commenter la réponse de dvwyns