Accueil > > > CLASSE DE COUPAGE DE TEXTE HTML AVEC CONSERVATION DES BALISES
CLASSE DE COUPAGE DE TEXTE HTML AVEC CONSERVATION DES BALISES
Information sur la source
Description
Bonjour, Cette classe permet de couper une chaîne de caractère à une longueur donnée. La chaîne sera coupée entre deux mots et en dehors d'une balise. Toutes les balises qui sont restées ouverte sont refermées à la fin de la chaîne. Les balises ne sont pas exclues du calcul du nombre de caractères. La classe gère les balises de type <br /> (qui n'ont qu'une seul balise). Avec la généralisation des éditeurs wysiwyg qui retournent du texte html, ce genre de script devrait être de plus en plus rependu. Exemple : <p>Lorem ipsum <i>dolor</i> sit amet, <b>consec tetuer adipiscing elit</b></p>. <p>Lorem ipsum <i>dolor</i> sit amet, <b>consec</b></p>
Source
- <?php
- class HtmlString {
-
- /*
- Chaine d'origine
- */
- private $strChaineOrigine;
-
- /*
- Chaine coupée à la longueur donnée
- */
- private $strChaineCoupee;
-
- /*
- Caractère ou doit se faire la césure
- Par défaut, un espace
- */
- private $strCaractereCesure = ' ';
-
- /*
- Messages d'erreur
- */
- private $strErreur;
-
- /*
- Position de la césure
- */
- private $intCesurePos;
-
- /*
- Position du dernier espace de la chaine coupée
- */
- private $intDernierCaracCesure;
-
- /*
- Valeur de décrémentation de la taille de la chaine si on est dans une balise
- */
- private $intDecrementationCesurePos = 5;
-
- /*
- Indique si la césure est bien faite en dehors d'une balise
- Par défaut on considère qu'elle est effectuée au milieu d'une balise
- */
- private $blnCesureHorsBalise = 0;
-
- /*
- Indique si la chaine est plus courte que la longueur de césure
- Par défaut la chaine est plus longue
- */
- private $blnChaineTropCourte = 0;
-
- /*
- Pile des balises ouvertes
- */
- private $t_strBalisesOuvertes;
-
- function __construct($strChaineOrigine, $intCesurePos) {
- $this->strChaineOrigine = $strChaineOrigine;
- $this->intCesurePos = $intCesurePos;
- }
-
- function SetParams($strCaractereCesure, $intDecrementationCesurePos) {
- $this->strCaractereCesure = $strCaractereCesure;
- $this->intDecrementationCesurePos = $intDecrementationCesurePos;
- }
-
- /*
- Coupe la chaine d'origine au dernier espace avant la longueur voulue
- */
- private function CouperChaine(){
- /* Coupe la chaine à la longuer maximale */
- $this->strChaineCoupee = substr($this->strChaineOrigine, 0, $this->intCesurePos);
- /* Extrait la position du dernier caractère de césure de la chaine coupée */
- $this->intDernierCaracCesure = strrpos($this->strChaineCoupee, $this->strCaractereCesure);
-
- /* Si le caractère de césure a été trouvé */
- if($this->intDernierCaracCesure)
- /* Coupe la chaine au dernier espace de sa longueur maximale */
- $this->strChaineCoupee = substr($this->strChaineOrigine, 0, $this->intDernierCaracCesure);
- }
-
- /*
- Vérifie que la césure n'aie pas été effectuée au milieu d'une balise
- */
- private function VerifierCesure() {
-
- /* Parcours toute la chaine depuis la fin */
- for($i=strlen($this->strChaineCoupee)-1; $i>=0; $i--) {
-
- /* Si on tombe sur une fermeture de balise */
- if($this->strChaineCoupee[$i] == '>' && $this->strChaineCoupee[$i-1] != '\\') {
- /* Alors on est pas dans une balise */
- $this->blnCesureHorsBalise = 1;
- break;
- }
- /* Si on tombe sur une ouverture de balise, alors on est dans une balise */
- elseif($this->strChaineCoupee[$i] == '<' && $this->strChaineCoupee[$i-1] != '\\') {
- /* On le respécifie même si la valeur est censée être à 0 */
- $this->blnCesureHorsBalise = 0;
- break;
- }
-
- /* Si c'est le premier caractère de la chaine */
- if($i==0)
- /* Alors c'est qu'il n'y avait pas de balises du tout */
- $this->blnCesureHorsBalise = 1;
- }
- }
-
- /*
- Vérifie que la chaine soit plus longue que la position de césure
- */
- private function VerifierLongueurChaine(){
- /* Si la chaine est vide */
- if(strlen($this->strChaineOrigine) == 0)
- /* Indiquer que la chaine est trop courte */
- $this->blnChaineTropCourte = 1;
- /* Si la chaine est plus petite que la position de césure */
- elseif(strlen($this->strChaineOrigine) <= $this->intCesurePos)
- /* Indiquer que la chaine est trop courte */
- $this->blnChaineTropCourte = 1;
- /* Si la chaine est plus grande */
- else
- /* Indiquer que la chaine n'est pas trop courte */
- $this->blnChaineTropCourte = 0;
- }
-
- /*
- Obtient la chaine coupée à un espace en dehors d'une balise
- */
- private function ObtenirChaineCoupeeJuste() {
- /* Tant que la césure n'est pas effectuée en dehors d'une balise */
- while(!$this->blnCesureHorsBalise) {
- /* Couper la chaine */
- $this->CouperChaine();
-
- /* Réduire la longueur de la chaine coupée */
- if($this->intCesurePos - $this->intDecrementationCesurePos >= 0) {
- $this->intCesurePos -= $this->intDecrementationCesurePos;
- }
- /* Si on a réduit la position de césure au point de couper toute la chaine, on affiche une erreur */
- /* Peut arriver si la position de césure est courte et qu'il y a une très longue balise au début */
- else {
- $this->strErreur = 'Erreur : la position de la césure est trop courte par rapport à la taille de la chaine.';
- break;
- }
- $this->VerifierCesure();
- }
- }
-
- private function TrouverBalises() {
-
- /* Place toutes les balises ouvrantes dans un tableau */
- $strBalisesOuvrantes = preg_match_all('|<([a-z]+)[^>]*>|i', $this->strChaineCoupee, $t_strBalisesOuvrantes);
-
- /* Place le résultat dans le tableau de la classe */
- $this->t_strBalisesOuvertes = $t_strBalisesOuvrantes[1];
-
- /* Place toutes les balises fermantes dans un tableau */
- $strBalisesFermantes = preg_match_all('|</([a-z]+)[^>]*>|i', $this->strChaineCoupee, $t_strBalisesFermantes);
-
- /* Inverse le tableau des balises ouvrantes (vu qu'elles doivent se fermer en ordre inverse) */
- $this->t_strBalisesOuvertes = array_reverse($this->t_strBalisesOuvertes);
-
- /* Parcours le tableau des balises fermantes */
- foreach($t_strBalisesFermantes[1] as $Index => $strBaliseFermante) {
- /* Parcours le tableau des balises ouvrantes */
- foreach($this->t_strBalisesOuvertes as $Index => $strBaliseOuvrante) {
- /* Si le nom de la balise est identique */
- if($strBaliseOuvrante == $strBaliseFermante) {
- /* Supprime la balise de la liste des balises ouvrantes */
- unset($this->t_strBalisesOuvertes[$Index]);
- break;
- }
- }
- }
- }
-
- private function FermerBalises() {
- /* Pour chaque balise ouverte restante */
- foreach($this->t_strBalisesOuvertes as $strBaliseOuverte)
- /* Ferme la balise */
- $this->strChaineCoupee .= '</' . $strBaliseOuverte . '>';
- }
-
- public function ExecuterCoupe() {
- $this->VerifierLongueurChaine();
-
- if(!$this->blnChaineTropCourte) {
- $this->ObtenirChaineCoupeeJuste();
- $this->TrouverBalises();
- $this->FermerBalises();
- $strRetour = $this->strChaineCoupee;
- }
- else {
- $strRetour = $this->strChaineOrigine;
- }
-
- if(strlen($this->strErreur) > 2)
- return $this->strErreur;
- else
- return $strRetour;
- }
- }
-
- ?>
<?php
class HtmlString {
/*
Chaine d'origine
*/
private $strChaineOrigine;
/*
Chaine coupée à la longueur donnée
*/
private $strChaineCoupee;
/*
Caractère ou doit se faire la césure
Par défaut, un espace
*/
private $strCaractereCesure = ' ';
/*
Messages d'erreur
*/
private $strErreur;
/*
Position de la césure
*/
private $intCesurePos;
/*
Position du dernier espace de la chaine coupée
*/
private $intDernierCaracCesure;
/*
Valeur de décrémentation de la taille de la chaine si on est dans une balise
*/
private $intDecrementationCesurePos = 5;
/*
Indique si la césure est bien faite en dehors d'une balise
Par défaut on considère qu'elle est effectuée au milieu d'une balise
*/
private $blnCesureHorsBalise = 0;
/*
Indique si la chaine est plus courte que la longueur de césure
Par défaut la chaine est plus longue
*/
private $blnChaineTropCourte = 0;
/*
Pile des balises ouvertes
*/
private $t_strBalisesOuvertes;
function __construct($strChaineOrigine, $intCesurePos) {
$this->strChaineOrigine = $strChaineOrigine;
$this->intCesurePos = $intCesurePos;
}
function SetParams($strCaractereCesure, $intDecrementationCesurePos) {
$this->strCaractereCesure = $strCaractereCesure;
$this->intDecrementationCesurePos = $intDecrementationCesurePos;
}
/*
Coupe la chaine d'origine au dernier espace avant la longueur voulue
*/
private function CouperChaine(){
/* Coupe la chaine à la longuer maximale */
$this->strChaineCoupee = substr($this->strChaineOrigine, 0, $this->intCesurePos);
/* Extrait la position du dernier caractère de césure de la chaine coupée */
$this->intDernierCaracCesure = strrpos($this->strChaineCoupee, $this->strCaractereCesure);
/* Si le caractère de césure a été trouvé */
if($this->intDernierCaracCesure)
/* Coupe la chaine au dernier espace de sa longueur maximale */
$this->strChaineCoupee = substr($this->strChaineOrigine, 0, $this->intDernierCaracCesure);
}
/*
Vérifie que la césure n'aie pas été effectuée au milieu d'une balise
*/
private function VerifierCesure() {
/* Parcours toute la chaine depuis la fin */
for($i=strlen($this->strChaineCoupee)-1; $i>=0; $i--) {
/* Si on tombe sur une fermeture de balise */
if($this->strChaineCoupee[$i] == '>' && $this->strChaineCoupee[$i-1] != '\\') {
/* Alors on est pas dans une balise */
$this->blnCesureHorsBalise = 1;
break;
}
/* Si on tombe sur une ouverture de balise, alors on est dans une balise */
elseif($this->strChaineCoupee[$i] == '<' && $this->strChaineCoupee[$i-1] != '\\') {
/* On le respécifie même si la valeur est censée être à 0 */
$this->blnCesureHorsBalise = 0;
break;
}
/* Si c'est le premier caractère de la chaine */
if($i==0)
/* Alors c'est qu'il n'y avait pas de balises du tout */
$this->blnCesureHorsBalise = 1;
}
}
/*
Vérifie que la chaine soit plus longue que la position de césure
*/
private function VerifierLongueurChaine(){
/* Si la chaine est vide */
if(strlen($this->strChaineOrigine) == 0)
/* Indiquer que la chaine est trop courte */
$this->blnChaineTropCourte = 1;
/* Si la chaine est plus petite que la position de césure */
elseif(strlen($this->strChaineOrigine) <= $this->intCesurePos)
/* Indiquer que la chaine est trop courte */
$this->blnChaineTropCourte = 1;
/* Si la chaine est plus grande */
else
/* Indiquer que la chaine n'est pas trop courte */
$this->blnChaineTropCourte = 0;
}
/*
Obtient la chaine coupée à un espace en dehors d'une balise
*/
private function ObtenirChaineCoupeeJuste() {
/* Tant que la césure n'est pas effectuée en dehors d'une balise */
while(!$this->blnCesureHorsBalise) {
/* Couper la chaine */
$this->CouperChaine();
/* Réduire la longueur de la chaine coupée */
if($this->intCesurePos - $this->intDecrementationCesurePos >= 0) {
$this->intCesurePos -= $this->intDecrementationCesurePos;
}
/* Si on a réduit la position de césure au point de couper toute la chaine, on affiche une erreur */
/* Peut arriver si la position de césure est courte et qu'il y a une très longue balise au début */
else {
$this->strErreur = 'Erreur : la position de la césure est trop courte par rapport à la taille de la chaine.';
break;
}
$this->VerifierCesure();
}
}
private function TrouverBalises() {
/* Place toutes les balises ouvrantes dans un tableau */
$strBalisesOuvrantes = preg_match_all('|<([a-z]+)[^>]*>|i', $this->strChaineCoupee, $t_strBalisesOuvrantes);
/* Place le résultat dans le tableau de la classe */
$this->t_strBalisesOuvertes = $t_strBalisesOuvrantes[1];
/* Place toutes les balises fermantes dans un tableau */
$strBalisesFermantes = preg_match_all('|</([a-z]+)[^>]*>|i', $this->strChaineCoupee, $t_strBalisesFermantes);
/* Inverse le tableau des balises ouvrantes (vu qu'elles doivent se fermer en ordre inverse) */
$this->t_strBalisesOuvertes = array_reverse($this->t_strBalisesOuvertes);
/* Parcours le tableau des balises fermantes */
foreach($t_strBalisesFermantes[1] as $Index => $strBaliseFermante) {
/* Parcours le tableau des balises ouvrantes */
foreach($this->t_strBalisesOuvertes as $Index => $strBaliseOuvrante) {
/* Si le nom de la balise est identique */
if($strBaliseOuvrante == $strBaliseFermante) {
/* Supprime la balise de la liste des balises ouvrantes */
unset($this->t_strBalisesOuvertes[$Index]);
break;
}
}
}
}
private function FermerBalises() {
/* Pour chaque balise ouverte restante */
foreach($this->t_strBalisesOuvertes as $strBaliseOuverte)
/* Ferme la balise */
$this->strChaineCoupee .= '</' . $strBaliseOuverte . '>';
}
public function ExecuterCoupe() {
$this->VerifierLongueurChaine();
if(!$this->blnChaineTropCourte) {
$this->ObtenirChaineCoupeeJuste();
$this->TrouverBalises();
$this->FermerBalises();
$strRetour = $this->strChaineCoupee;
}
else {
$strRetour = $this->strChaineOrigine;
}
if(strlen($this->strErreur) > 2)
return $this->strErreur;
else
return $strRetour;
}
}
?>
Conclusion
Il y a encore beaucoup d'améliorations à y apporter, dans la gestion des caractères échappés par exemple (\< ne doit pas être considéré comme balise si magic_quotes est activé)
C'est mon premier script en php orienté objet, donc il y a sûrement pas mal de choses a améliorer, n'hésitez surtout pas à faire des critiques.
Historique
- 24 janvier 2008 12:31:15 :
- Exemple d'application
- 21 février 2008 11:19:24 :
- Première modification ou une partie du script travaille maintenant avec des regex pour accélérer l'exécution.
Sources de la même categorie
RÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBERÉCUPÉRER LES MINIATURES D'UNE VIDÉO YOUTUBE Le code est simple, il permet depuis une url youtube de récupérer son identifiant et de se connecter au serveur de miniatures pour en récupérer les im...
par tefa24600
CONVERTISSEUR DE NOMBRES EN TEXTECONVERTISSEUR DE NOMBRES EN TEXTEQu'est-ce ? Un convertisseur de nombre en texte.
Ses particularités?
- pas de limitation sur la taille du nombre (traitement en string, et non en ...
par macruz
CODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGECODAGE TEXTE >HTML, ISO, SPECIALCHARS, URL ET DECODAGECe script php permet, comme son nom l'indique de coder un texte pour remplacer les caractères spéciaux, ou apprendre à comprendre les htmlentities, sp...
par Salva9473
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Supprimer les balises html d'une chaine de caractère [ par SAaD44 ]
Salut !Voila, je cherche le moyen de supprimer toutes les balises html (de début et de fin) d'une chaine de caractère.Merci d'avance SAâD
supprimer le contenu des balises script [ par caviar ]
Saluté ...j'ai un petit casse tête à résoudre ...j'aimerai filtrer les balises scripts dans un code html et les supprimerimaginon que j'ai en html ava
Remplacer [ par pcgpegase ]
Bonjour,Je vous expose mon problème :J'ai un champs de type TEXT dans ma base MySQL qui contient donc du texte !Quand je fais afficher ce texte, c'est
decoupe de chaine [ par atchoumen ]
Bonjour,V'la je suis bloquer sur un problème un peu débile donc je fais appel a vous. Voici le code :<? $nb_car = 900; $montexte = $enregistremen
Couper une chaine tous les X mots [ par 3xodius55 ]
Bonjour (ou re-bonjour pour quelques uns^^),Est-ce que vous sauriez par hasard comment je pourrai couper une chaine tous les X mots.La chaîne en quest
Recuperer des informations d'une fichier xml [ par dbzonline ]
salut tous , alors j'ai une petite question j'ai recupéré un code disponible sur le site pour generer une image avec du texte , je l'ai adapté et main
Supprimer les balises html [ par ImmortalPC ]
Salut,J'aimerai savoir comment faire pour supprimer tout les balises éventuelle et ne garder que le texte tout cela dans une varriable ou plusieu
Redimensionner une image entre deux balises [ par thecomputerman ]
Bonjour,J'ai un petit soucis avec le redimensionnement d'images. Tout d'abord quand une image est insérée dans un texte c'est entre deux balises [img]
Calculer le contenu d'une chaine de texte [ par dragon ]
Bonjour à tous,j'aimerais me créé un BBCode pour mon forum qui serait capapble de faire des calculs simples (+,-,*,/). J'aimerais savoir s'il existe u
pb mail html [ par Diablo62 ]
bonjour je suis en train de faire des tests d'envoie de mail en html et txt mais cela ne marche pas apparament sur homail j ai un mail vide et sur out
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|