IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez / Téléchargez Sources et Outils PHP Discussion :

[discussion] Réparer du code HTML


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #121
    Invité
    Invité(e)
    Par défaut
    Mon TUTORIEL est ENFIN EN LIGNE
    "Système de Gestion-Affichage de Nouvelles" :
    http://j-reaux.developpez.com/tutori.../gestion-news/

    Vous êtes cités (et remerciés) ICI.
    (en espérant n'avoir oublié personne ...)

  2. #122
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    [B][COLOR="Red"]Mon TUTORIEL est ENFIN EN LIGNE !

    Ca mon Ami c'est du faire-play, et j'en ais honte car on a pas trop bossé quand même, cependant un échange collectif pour créer c'est toujours sympa !


    Création : juin 2009 en collectif : Xunil, jreaux62, s.n.a.f.u., FoxLeRenard, Doksuri, Patouche,
    suite à une discussion fort interessante concernant la "réparation de code html" :
    http://www.developpez.net/forums/d75...rer-code-html/

    Un grand remerciement à tous les participants de cette discussion !


  3. #123
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    C'est pas juste !!

    Maintenant que suis libre vous avez déjà fini .....

    Félicitations surtout aux autres qui ont bien bossé et à jreaux62 pour la rédaction du tutoriel...


    Cordialement,
    Patouche


    PS : Pour ceux qui font du MATLAB, éviter de faire des interfaces graphiques !! C'est casse pied au possible (et tout ça c'est sûrement dû à mes pauvres connaissances en MATLAB....)
    PS2 : Vivement le stage de cet été ... Que du web (php, monitoring, opcode, ...) miam !!

  4. #124
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 451
    Points : 4 600
    Points
    4 600
    Par défaut
    Salut a vous
    je suis desole de ne pas avoir pu finir avec vous, je suis en interime pour l'ete, et cette semaine, je n'ai pas eu de temps... (en plus un gardien m'a perdu ma carte d'identite, donc pas mal de stress/papiers en plus)

    je ne pensais pas que ca se finirait aussi rapidement >_<

    bravo a toi jreaux62 pour le tuto et bravo au autres aussi

    il ne reste plus qu'a mettre le tag pour cette discution
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  5. #125
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par patouche Voir le message
    Maintenant que suis libre vous avez déjà fini .....
    NON, CE N'EST PAS FINI !
    Certes, pour mon tuto "News", c'est suffisant (pour moi).
    Grand à vous tous pour votre aide !

    Mais ... il reste du pain sur la planche !

    Xunil a proposé une "classe" qui à l'air intéressante,
    et il reste sûrement encore quelques problèmes à se poser, et à résoudre :
    - les div, form, table, ...
    - ...
    Bref : une étude COMPLETE d'un code html !

    Et je pense qu'il faudrait PUBLIER cette "source" (indépendamment de mon tuto "News"),
    car elle peut servir dans bien d'autres cas, non ?

  6. #126
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Janvier 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Janvier 2008
    Messages : 227
    Points : 273
    Points
    273
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    NON, CE N'EST PAS FINI !
    ....


    Bon alors, où en est t'on ?? Cherche-t-on maintenant la validité, la complexité ? Et surtout, où vas-t-on ???

  7. #127
    Invité
    Invité(e)
    Par défaut Résumé
    On en est là :

    fct_resume_html.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    <?php
    // ****************************************************************
    // RESUME d un texte html + reparation des balises html
    // ****************************************************************
    // Création : juin 2009 en collectif : Xunil, jreaux62, s.n.a.f.u., FoxLeRenard, Doksuri, Patouche
    // http://www.developpez.net/forums/d757484-8/php/langage/contribuez/discussion-reparer-code-html/
     
    // $texte : le texte formaté (avec des balise html)
    // $nbreCar : le nombre de caractères texte à afficher (sans compter les balises html)
    // $nbreCar (minimum) : pour ne pas couper un mot, le compte s arretera a l espace suivant
    // --------------------------------
    function texte_resume($texte, $nbreCar)
    {
    	// **********************************
    	// MASQUE de l'expression régulière
    	// **********************************
    	$MasqueHtmlSplit = '#</?([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?>#';
    	$MasqueHtmlMatch = '#<(?:/([a-zA-Z1-6]+)|([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?)>#';
    	// ----------------------------------
    	// Explication du masque : recherche de TOUTES les balises html
    	// ---------------
    	// détail : </?([a-zA-Z1-6]+)
    	// recherche de chaines commencant par un < 
    	// suivi optionnellement d'un / (==> balises "fermantes")
    	// suivi de (caractères alphabétiques (insensible à la casse) ou numériques (1 à 6)) au moins une fois
    	// Suivi optionnellement (0, 1fois ou plus) par un ou plusieurs attributs et leur valeur :
    	// ---------------
    	// détail : (?: +[a-zA-Z]+="[^"]*")*
    	// caractère espace une fois ou plus [space]+
    	// suivi d'au moins un caractère alphabétique [a-zA-Z]+
    	// suivi d'un =
    	// suivi d'une paire de guillemets contenant otpionnellement (0, 1fois ou plus) tout caractère autre que guillemet "[^"]*"
    	// ---------------
    	// détail : ( ?/)?
    	// caractère espace optionnel [space]?
    	// suivi optionnellement d'un slash / (==> balises "orphelines")
    	// NB : un :? suivant une parenthèse ouvrante signifie que l'on ne capture pas la parenthèse
     
    	// **********************************
    	// RECHERCHE DU TEXTE DU RESUME
    	// **********************************
    	// ajout d'un espace de fin au cas ou le texte n'en contiendrait pas...
    	$texte .= ' ';
    	// ----------------------------------
    	// Capture de tous les bouts de texte (en dehors des balises html)
    	$BoutsTexte = preg_split($MasqueHtmlSplit, $texte, -1,  PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY);
    	// ----------------------------------
    	// Explication preg_split : voir http://fr.php.net/manual/fr/function.preg-split.php
    	// => on obtient un tableau (array) :
    	// $BoutsTexte[xx][0] : le bout de texte
    	// $BoutsTexte[xx][1] : sa position (dans la chaine)
    	// ----------------------------------
    	// Nombre d éléments du tableau
    	$NombreBouts = count($BoutsTexte);
     
    	// **********************************
    	// CALCUL de la POSITION de la coupe
    	// **********************************
    	// Si seulement un seul élément dans l'array, c'est que le texte ne contient pas de balises :
    	// on renvoie directement le texte tronqué
    	if( $NombreBouts == 1 )
    	{
    		$longueur = strlen($texte);
    		// pour ne pas couper un mot, on va a l espace suivant
    		return substr($texte, 0, strpos($texte, ' ', $longueur > $nbreCar ? $nbreCar : $longueur));
    	}
    	// ----------------------------------
    	// Variable contenant la longueur des bouts de texte
    	$longueur = 0;
    	// ----------------------------------
    	// (position du dernier élément du tableau $chaines)
    	$indexDernierBout = $NombreBouts - 1;
    	// ----------------------------------
    	// Position par défaut de la césure au cas ou la longueur du texte serait inférieure au nombre de caratères à sélectionner
    	// La position de la césure est égal à sa position [1] + la longueur du bout de texte [0] - 1 (dernier caractère)
    	$position = $BoutsTexte[$indexDernierBout][1] + strlen($BoutsTexte[$indexDernierBout][0]) - 1;
    	// ----------------------------------
    	$indexBout = $indexDernierBout;
    	$rechercheEspace = true;
    	// ----------------------------------
    	// Boucle parcourant l'array et ayant pour fonction d'incrémenter au fur et à mesure la longueur des morceaux de texte, 
    	// et de calculer la position de césure de l'extrait dans le texte
    	foreach( $BoutsTexte as $index => $bout )
    	{
    		$longueur += strlen($bout[0]);
    		// Si la longueur désirée de l'extrait à obtenir est atteinte
    		if( $longueur >= $nbreCar )
    		{
    			// On calcule la position de césure du texte (position de chaîne + sa longueur -1 )
    			$position_fin_bout = $bout[1] + strlen($bout[0]) - 1;
    			// calcul de la position de césure
    			$position = $position_fin_bout - ($longueur - $nbreCar);
    			// On regarde si un espace est présent après la position dans le bout de texte
    			if( ($positionEspace = strpos($bout[0], ' ', $position - $bout[1])) !== false  )
    			{
    				// Un espace est détecte dans le bout de texte APRÈS la position
    				$position = $bout[1] + $positionEspace;
    				$rechercheEspace = false;
    			}
    			// Si on ne se trouve pas sur le dernier élément
    			if( $index != $indexDernierBout )
    				$indexBout = $index + 1;
    			break;
    		}
    	}
    	// ----------------------------------
    	// Donc il n'y avait pas d'espace dans le bout de texte où la position de césure sert de référence
    	if( $rechercheEspace === true )
    	{
    		// Recherche d'un espace dans les bouts de texte suivants
    		for( $i=$indexBout; $i<=$indexDernierBout; $i++ )
    		{
    			$position = $BoutsTexte[$i][1];
    			if( ($positionEspace = strpos($BoutsTexte[$i][0], ' ')) !== false )
    			{
    				$position += $positionEspace;
    				break;
    			}
    		}
    	}
    	// **********************************
    	// COUPE DU TEXTE pour le RESUME
    	// **********************************
    	// On effectue la césure sur le texte suivant la position calculée
    	$texte = substr($texte, 0, $position);
     
    	// **********************************
    	// RECHERCHE DES BALISES HTML
    	// **********************************
    	// Récupération de toutes les balises du texte et de leur position (PREG_OFFSET_CAPTURE)
    	preg_match_all($MasqueHtmlMatch, $texte, $retour, PREG_OFFSET_CAPTURE);
    	// ----------------------------------
    	// Explication preg_match_all : voir http://fr.php.net/manual/fr/function.preg-match-all.php
    	// $retour[0][xx][0] contient la balise html entière
    	// $retour[0][xx][1] contient la position de la balise html entière
    	// $retour[1][xx][0] contient le nom de la balise html fermante$rechercheEspace
    	// $retour[2][xx][0] contient le nom de la balise html ouvrante
    	// $retour[3][xx][0] contient le slash de fermeture de balise unique (cette varaible n'existe pas si la balise n'est pas unique)
    	// ----------------------------------
    	// Array destiné à enregistrer les noms de balises ouvrantes
    	$BoutsTag = array();
    	// ----------------------------------
    	foreach( $retour[0] as $index => $tag )
    	{
    		// Si on se trouve sur une balise unique, on passe au tour suivant
    		if( isset($retour[3][$index][0]) )
    		{
    			continue;
    		}
    		// Si le caractère slash n'est pas détecté en seconde position dans la balise entière, on est sur une balise ouvrante
    		if( $retour[0][$index][0][1] != '/' )
    		{
    			// On empile l'élément en début de l'array
    			array_unshift($BoutsTag, $retour[2][$index][0]);
    		}
    		// Donc balise fermante
    		else
    		{
    			// suppression du premier élément de l'array
    			array_shift($BoutsTag);
    		}
    	}
    	// **********************************
    	// REPARATION des balises html
    	// **********************************
    	// Il reste des tags à fermer ?
    	// balises ouvertes, mais non-fermées : on ajoute les balises fermantes a la fin du texte
    	if( !empty($BoutsTag) )
    	{
    		foreach( $BoutsTag as $tag )
    		{
    			$texte .= '</' . $tag . '>';
    		}
    	}
    	// ----------------------------------
    	// On renvoie le résumé du texte correctement formaté.
    	return $texte;
    }
    ?>
    fct_resume_brut.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    // ****************************************************************
    // RESUME BRUT d un texte html : SUPPRESSION des balises html
    // ****************************************************************
    // Création : juin 2009 en collectif : Xunil, jreaux62, s.n.a.f.u., FoxLeRenard, Doksuri, Patouche
    // http://www.developpez.net/forums/d757484-8/php/langage/contribuez/discussion-reparer-code-html/
     
    // $texte : le texte formaté (avec des balise html)
    // $nbreCar : le nombre de caractères texte à afficher (sans compter les balises html)
    // $nbreCar (minimum) : pour ne pas couper un mot, le compte s arretera a l espace suivant
    // --------------------------------
    function texte_resume($texte, $nbreCar)
    {
    	// **********************************
    	// SUPPRESSION des balises html
    	// **********************************
    	$texte = strip_tags($texte);
    	// Explication strip_tags : voir http://fr.php.net/manual/fr/function.strip-tags.php
     
    	// **********************************
    	// COUPE DU TEXTE pour le RESUME
    	// **********************************
    	// ajout d'un espace de fin au cas ou le texte n'en contiendrait pas...
    	$texte .= ' ';
    	// ----------------------------------
    	$longueur = strlen($texte);
    	// pour ne pas couper un mot, on va a l espace suivant
    	$texte = substr($texte, 0, strpos($texte, ' ', $longueur > $nbreCar ? $nbreCar : $longueur));
     
    	// ----------------------------------
    	// On renvoie le résumé du texte correctement formaté.
    	return $texte;
    }
    ?>
    et la class ResumeTexte de Xunil (cf message du 15/06/2009, 18h45) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    define('RESUME_TEXTE_TYPE_HTML', 1);
    define('RESUME_TEXTE_TYPE_XHTML', 2);
     
    class ResumeTexte
    {
       private $texte;
       private $taille;
       private $htmlType;
     
       private $listeTag = array('p', 'span', 'b', 'strong', 'em', 'u', 'br', 'img', 'hr');   // Liste blanche par défaut des balises à conserver
       private $simpleTag = array('img', 'br', 'hr'); // Liste des balises simples à conserver par défaut
       private $deleteBloc = array('ul', 'ol', 'table', 'dl'); // Bloc html complexe à supprimer du texte
     
       private $listeTagAttributConserve;  // Liste des balises dont les attributs doivent-être conservés
       private $listeTagAttributSupprime;  // Liste ds balises dont les attributs doivent-être supprimés
     
       private $attributConserve = true;   // Conservation des attributs html
       private $entiteTransforme = false;  // Retour du texte par htmlspecialchars
     
       /***
       Constructeur
       @param $texte : le texte 
       @param $htmlType : défini si le texte contient du html ou xhtml doit avoir une valeur d'une constante parmi:
           RESUME_TEXTE_TYPE_XHTML (par défaut)
           RESUME_TEXTE_TYPE_HTML
       **/
       function __construct($texte, $taille=200, $htmlType = RESUME_TEXTE_TYPE_XHTML)
       {
          $this->texte = $texte . ' ';
          $this->taille = (int)$taille;
          $this->htmlType = $htmlType & RESUME_TEXTE_TYPE_XHTML ? $htmlType : RESUME_TEXTE_TYPE_HTML;
       }
     
       /***
       Sert à valider les caractères contenus dans les balises définies via array_filter
       **/
       private function valideTag($tags, $function)
       {
          if( array_filter($tags, 'ctype_alnum') != $tags )
          {
             trigger_error(__CLASS__ . '::' . $function . ' : les balises fournies doivent-être de type alphanumériques', E_USER_WARNING);
             return false;
          }
          return true;
       }
     
       /***
       Permet de charger une liste blanche de balise depuis un fichier structuré sous la forme 1 ligne = 1 balise
       @param $fichier : chemin vers le fichier
       **/
       public function loadTag($fichier)
       {  
          if( !is_file($fichier) )
             trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : le fichier "' . $fichier . '" est introuvable', E_USER_WARNING);
          else
          {
             $lignes = file($fichier);
             $tags = array_filter(array_map('trim', $lignes));
             if( $this->valideTag($tags, __FUNCTION__) )
                $this->listeTag = $tags;
          }
       }
     
       /***
       Permet de charger une liste blanche de balise via un array
       @param $listeTag : array des balises
       **/
       public function setTag($listeTag)
       {
          if( $this->valideTag($listeTag, __FUNCTION__) )
             $this->listeTag = $listeTag;
       }
     
       /***
       Permet de définir si le texte à retourner doit-être passer par htmlspecialchars
       @param $bool : true ou false
       **/
       public function setEntite($bool)
       {
          $this->entiteTransform = (bool)$bool;
       }
     
       /***
       Permet de définir si les attributs des balises html doivent-être conservés
       @param $bool : true ou false
       NOTE :
          - Si valeur passée à true, $this->listeTagAttributConserve ne doit pas être défini
          - Si passée à false, $this->listeTagAttributSupprime ne doit pas être défini
       **/
       public function setAttributConserve($bool)
       {
          settype($bool, 'bool');
          if( $bool === true && isset($this->listeTagAttributConserve) )
             trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : vous avez défini la conservation des attributs à "true" alors qu\'une liste de balises dont les attributs doivent-être conservés a été définie', E_USER_NOTICE);
          elseif( $bool === false && isset($this->listeTagAttributSupprime) )
             trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : vous avez défini la conservation des attributs à "false" alors qu\'une liste de balises dont les attributs doivent-être supprimés a été définie', E_USER_NOTICE);
          $this->attributConserve = $bool;
       }
     
       /***
       Permet de définir quelles balises DOIVENT conserver leurs attributs
       @param $listeTag : liste des balises dont les attributs doivent-être conservés 
       NOTE : 
          - les balises doivent-être contenues IMPÉRATIVEMENT dans $this->listeTag
          -  $this->attributConserve ne doit pas être à true
          - $this->listeTagAttributSuprime ne doit pas être défini 
       **/
       public function setListeTagAttributConserve($listeTag)
       {
          settype($listeTag, 'array');
          if( $this->valideTag($listeTag, __FUNCTION__) )
          {
             if( array_diff($listeTag, $this->listeTag) )
                trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : la liste des balises fournies ne concorde pas avec la liste des balises à conserver', E_USER_WARNING);
             else
             {
                if( $this->attributConserve === true )
                   trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : vous avez défini la conservation des attributs à "true"', E_USER_NOTICE);
                $this->listeTagAttributConserve = $listeTag;
             }
          }
       }
     
       /***
       Permet de définir quelles balises NE DOIVENT PAS conserver leurs attributs
       @param $listeTag : liste des balises dont les attributs ne doivent pas être conservés 
       NOTE : 
          - les balises doivent-être contenues IMPÉRATIVEMENT dans $this->listeTag
          -  $this->attributConserve ne doit pas être à false
          - listeTagAttributConserve ne doit pas être défini 
       **/ 
       public function setListeTagAttributSupprime($listeTag)
       {
          settype($listeTag, 'array');
          if( $this->valideTag($listeTag, __FUNCTION__) )
          {
             if( array_diff($listeTag, $this->listeTag) )
                trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : la liste des balises fournies ne concorde pas avec la liste des balises à conserver', E_USER_WARNING);
             else
             {
                if( $this->attributConserve === false )
                   trigger_error(__CLASS__ . '::' . __FUNCTION__ . ' : vous avez défini la conservation des attributs à "false"', E_USER_NOTICE);
                $this->listeTagAttributSupprime = $listeTag;
             }
          }
       }
     
       /***
       Permet d'ajouter les blocs html à supprimer ou de redéfinir la liste
       @param $bloc : une balise ou un array de balises html
       @param $initialise : true ou false (si true la liste existante est vidée)
       **/
       public function setDeleteBloc($bloc, $initialise = false)
       {
          if( !is_array($bloc) )
             $bloc = array($bloc);
          $initialise === false ? $this->deleteBloc = array_merge($this->deleteBloc, $bloc) : $this->deleteBloc = $bloc;
       }
     
       /***
       Fonction de rappel nécessaire à la suppression des balises non-autorisées
       @param $array : array de capture de la chaine par preg_replace_callback
       **/
       private function callbackSupprimeTag($array)
       {
          return (in_array($array[1], $this->listeTag) ? $array[0] : '');
       }
     
       /***
       Sert à préparer le texte en fonction des éléments fournis
       **/
       private function textePrepare()
       {
          // Supression des blocs de balises complexe du texte (balises et tout leur contenu)
          $this->texte = preg_replace('#<(' . implode('|',$this->deleteBloc) . ')( +[a-zA-Z]+="[^"]*")*>.+</\1>#Us', '', $this->texte);
     
          // Suppression des balises de début et fin autres que celles autorisées
          $this->texte = preg_replace_callback('#</?([a-zA-Z1-6]+)( +[a-zA-Z]+="[^"]*")*( ?/)?>#', array($this, 'callbackSupprimeTag'), $this->texte);
     
          // Ajout d'un / de fin sur les balises simples si texte en html (pour facilité de travail par la suite)
          if( $this->htmlType & RESUME_TEXTE_TYPE_HTML )
             $this->texte = preg_replace('#(<(?:' . implode('|', $this->simpleTag) . ')(?: +[a-zA-Z]+="[^"]*")*)>#', '$1 />', $this->texte);
          // Option de supprimer/conserver tous/en partie les attributs des balises
          if( $this->attributConserve == false )
          {
             // Si une liste de balises dont les attributs sont à conserver existe
             if( isset($this->listeTagAttributConserve) )
             {
                $listeDiff = array_diff($this->listeTag, $this->listeTagAttributConserve);
                $this->texte = preg_replace('#(<(' . implode('|', $listeDiff) . ')(?: +[a-zA-Z]+="[^"]*")+)( ?/)?>#', '<$1$2>', $this->texte);
             }
             else
                $this->texte = preg_replace('#(<(' . implode('|', $this->listeTag) . ')(?: +[a-zA-Z]+="[^"]*")+)( ?/)?>#', '<$1$2>', $this->texte);
          }
          // Conservation des attributs
          else
          {
             // Si une liste de balises dont les attributs sont à supprimer existe
             if( isset($this->listeTagAttributSupprime) )
                $this->texte = preg_replace('#<(' . implode('|', $this->listeTagAttributSupprime) . ')(?: +[a-zA-Z]+="[^"]*")+( ?/)?>#', '<$1$2>', $this->texte);
          }
       }
     
       /***
       Function servant à césurer le texte du nombre de caractères souhaités.
       Le principe est de :
          - Récupérer d'un côté tous les morceaux de texte et leur offset, et de l'autre toutes les balises html et leur offset
          - De calculer la longueur des morceaux mit bout à bout, et de trouver la position de césure en fonction de leurs longueurs
          - De couper le texte sur un espace suivant la position de césure trouvée
          - Et enfin de compléter le texte par les balises html de fin manquantes
       **/
     
       private function generation()
       {
          $masqueExpressionSplit = '#</?([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?>#';
          $masqueExpressionMatch = '#<(?:/([a-zA-Z1-6]+)|([a-zA-Z1-6]+)(?: +[a-zA-Z]+="[^"]*")*( ?/)?)>#';
     
          $morceauTexte = preg_split($masqueExpressionSplit, $this->texte, -1,  PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_NO_EMPTY);
          $nombreMorceau = count($morceauTexte);
     
          if( $nombreMorceau == 1 )
          {
             $longueur = mb_strlen($this->texte);
             // pour ne pas couper un mot, on va a l espace suivant
             $this->texte = substr($texte, 0, strpos($this->texte, ' ', $longueur > $nombreMorceau ? $nombreMorceau : $longueur));
          }
          else
          {
             // Variable contenant la longueur des bouts de texte
             $longueur = 0;
     
             // (position du dernier élément du tableau $chaines)
             $indexDernierElementMorceau = $nombreMorceau - 1;
             // Position par défaut de la césure au cas ou la longueur du texte serait inférieure au nombre de caratères à sélectionner
             // La position de la césure est égal à sa position [1] + la longueur du bout de texte [0] - 1 (dernier caractère)
             $position = $morceauTexte[$indexDernierElementMorceau][1] + mb_strlen($morceauTexte[$indexDernierElementMorceau][0]) - 1;
             // Boucle parcourant l'array et ayant pour fonction d'incrémenter au fur et à mesure la longueur des morceaux de texte, 
             // et de calculer la position de césure de l'extrait dans le texte
     
             $indexMorceau = $indexDernierElementMorceau;
             $rechercheEspace = true;
             foreach( $morceauTexte as $index => $morceau )
             {
                $longueur += mb_strlen($morceau[0]);
                // Si la longueur désirée de l'extrait à obtenir est atteinte
                if( $longueur >= $this->taille )
                {
                   // On calcule la position de césure du texte (position de chaîne + sa longueur -1 )
                   $positionFinMorceau = $morceau[1] + mb_strlen($morceau[0]) - 1;
                   // calcul de la position de césure
                   $position = $positionFinMorceau - ($longueur - $this->taille);
                   // On regarde si un espace est présent après la position dans le bout de texte
                   if( ($positionEspace = strpos($morceau[0], ' ', $position - $morceau[1])) !== false  )
                   {
                      // Un espace est détecte dans le bout de texte APRÈS la position
                      $position = $morceau[1] + $positionEspace;
                      $rechercheEspace = false;
                   }
                   // Si on ne se trouve pas sur le dernier élément
                   if( $index != $indexDernierElementMorceau )
                      $indexMorceau = $index + 1;
                   break;
                }
             }
     
             // Donc il n'y avait pas d'espace dans le bout de texte où la position de césure sert de référence
             if( $rechercheEspace === true )
             {
                // Recherche d'un espace dans les bouts de texte suivants
                for( $i=$indexMorceau; $i<=$indexDernierElementMorceau; $i++ )
                {
                   $position = $morceauTexte[$i][1];
                   if( ($positionEspace = strpos($morceauTexte[$i][0], ' ')) !== false )
                   {
                      $position += $positionEspace;
                      break;
                   }
     
                }
             }         
             // On effectue la césure sur le texte suivant la position calculée
             $this->texte = substr($this->texte, 0, $position);
     
             // Récupération de toutes les balises du texte et de leur position (PREG_OFFSET_CAPTURE)
             preg_match_all($masqueExpressionMatch, $this->texte, $retour, PREG_OFFSET_CAPTURE);
     
             // Array destiné à enregistrer les noms de balises ouvrantes
             $tags = array();
     
             foreach( $retour[0] as $index => $tag )
             {
                // Si on se trouve sur une balise unique, on passe au tour suivant
                if( isset($retour[3][$index][0]) )
                   continue;
                // Si le caractère slash n'est pas détecté en seconde position dans la balise entière, on est sur une balise ouvrante
                if( $retour[0][$index][0][1] != '/' )
                   // On empile l'élément en début de l'array
                   array_unshift($tags, $retour[2][$index][0]);
                // Donc balise fermante
                else
                   // suppression du premier élément de l'array
                   array_shift($tags);
             }
     
             // réparation du code si necessaire (balises ouvertes, mais non-fermées)
             if( !empty($tags) ) {
                foreach( $tags as $tag ) {
                   $this->texte .= '</' . $tag . '>';
                }
             }
          }
       }
     
       /***
       Retournera le texte césuré
       **/
       public function resume()
       {
          $this->textePrepare();
          $this->generation();
          // Suppression du " /" de fin sur les balises uniques si HTML
          if( $this->htmlType & RESUME_TEXTE_TYPE_HTML )
             $this->texte = preg_replace('#<(' . implode('|', $this->listeTag) . ')( +[a-zA-Z]+="[^"]*")*(:? ?/)?>#', '<$1$2>', $this->texte);
          return $this->texte;
       }
    }
     
    header('Content-type: text/html');
     
    $texte = <<<TeXt
    <div id="a">
    <p class="class1">Loin, très loin, <b>au delà des monts Mots</b>, à mille lieues des pays 
    <a href="http://vasvoirlabas.com">Voyellie et Consonnia</a>, demeurent les <span style="color: blue">Bolos Bolos</span>. Ils vivent en retrait, à <a href="http://petaouchnock.org">Bourg-en-Lettres</a>, sur les côtes de la Sémantique, <img src="un vaste océan de langues" />.</p>
    <ul>
    <li>one</li>
    <li>dos</li>
    </ul>
    <p class="class1">Un petit ruisseau, du nom de <a href="http://zoralarousse.net">Larousse</a>, coule en leur lieu <span style="font-style: oblique">et les approvisionne en <strong>règlalades</strong> nécessaires en tout genre</span>; un pays paradisiagmatique, dans lequel des pans entiers de phrases prémâchées vous volent litéralement tout cuit dans la bouche.
    <hr class="oops" />Pas même la toute puissante Ponctuation ne régit les Bolos Bolos - une vie on ne peut moins orthodoxographique. <a href="http://unjourmonprince.net">Un jour pourtant</a>, une petite ligne de Bolo Bolo du nom de Lorem Ipsum décida de s'aventurer dans la vaste Grammaire.
    </p>
    </div>
    TeXt;
     
    $Resume = new ResumeTexte($texte, 250);
    $Resume->setTag(array('a', 'span', 'p', 'em', 'u', 'b', 'strong', 'img'));
    $Resume->setListeTagAttributSupprime('p');
    echo $Resume->resume();

  8. #128
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    maintenant prendre un résumé mal fait et corriger les balises ^^
    Fermer celles non fermées etc ^^

    Pcq là ces fonctions font le travail d'amont. Cependant on peux en avoir besoin en aval.

  9. #129
    Invité
    Invité(e)
    Par défaut
    Bonjour - bonsoir à tous !
    QUE FAIT-ON ?
    (ce serait dommage que le travail de réflexion soit "perdu" ...)

    La "classe" de Xunil a-t-elle été vérifiée ?
    En l'état, elle semble déjà "pas mal".
    Est-elle améliorable ? Probablement ... Qu'en dites-vous ?

  10. #130
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Hello, hello, hello, is there anybody in there

    jreaux62, tu peux faire ce que tu veux de cette fonction, si t'es chaud pour la publier, vas-y
    Néanmoins, il faudrait peut-être alléger les commentaires si tu souhaites le faire.

    En ce qui concerne la classe, je l'ai quand même codé très rapidement, et plein de choses sont à revoir, comme l'utilisation d'exception au lieu de trigger, meilleure intégration de la fonction de base à la classe.

    Et certaines choses ne me plaisent pas dans cette classe, surtout le fait de pouvoir définir des actions inverses (conservation/suppression attributs), après il y aurait beaucoup d'idées d'améliorations, les images par exemple en ne conservant que les images de dimensions inférieurs à x, définition encore plus approfondies des attributs à conserver en spécifiant balise + attribut(s) à garder.

    Mais comme personne n'a émit d'avis dessus...
    Peut-être que mon code n'est pas suffisamment compréhensible ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 7 sur 7 PremièrePremière ... 34567

Discussions similaires

  1. Insertion code html dans bdd
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/04/2004, 15h03
  2. code html en ram -> TWebBrowser pour affichage
    Par FredericB dans le forum C++Builder
    Réponses: 2
    Dernier message: 22/04/2003, 22h55
  3. Récupérer le code HTML d'une page avec Delphi 7
    Par PsyKroPack dans le forum Web & réseau
    Réponses: 5
    Dernier message: 06/02/2003, 21h56
  4. Générer du code HTML
    Par patpst dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/11/2002, 10h27
  5. composant builder4 pour afficher du code html
    Par BranRuz dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/09/2002, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo