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

Signaler
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
-
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012
-
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

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
faut faire une assertion :

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

Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
a quoi ressemble ta source HTML ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
67
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
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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
Messages postés
159
Date d'inscription
mardi 2 janvier 2007
Statut
Membre
Dernière intervention
7 mai 2012

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.="
";