Accès au manager - réservé aux membres

Navigation

Bouts de Codes PHP

Tronquer une chaîne de caractères HTML

Informations sur le code source PHP

Ecrit par :  lamogere
Site de l'auteur Voir
Autres codes en PHP de l'auteur : [13] sources Voir
Date d'enregistrement du code le 21 Mai 2008 - Vu 1814 fois
Code source zippé: Télécharger le fichier ZIP
Impression: Imprimer le code
Ajouter la page à vos favoris

Description du code source

Informations sur le code source

Ce script permet de tronquer une chaîne de caractères en coupant le texte au niveau d’un séparateur. La coupe n’a lieu qu’au milieu du texte au niveau d’un séparateur et referme toutes les balises encore ouvertes. Ce script tient compte des commentaires, des balises autofermantes (HR, BR, INPUT, …) ainsi que de la syntaxe XHTML (). Pour éviter que le texte soit trop court, les balises et les commentaires HTML ne sont pas comptés dans la longueur de la chaîne.
Un petit exemple d’utilisation de la fonction TronqueHtml est donné à la fin.

Code Source



.01
.02
.03
.04
.05
.06
.07
.08
.09
.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
.348
.349
.350
.351
.352
.353
.354
.355
.356
.357
.358
.359
.360
.361
.362
.363
.364
.365
.366
.367
.368
.369
.370
.371
.372
.373
.374
.375
.376
.377
.378
.379
.380
.381
.382
.383
.384
.385
.386
.387
.388
.389
.390
.391
.392
.393
.394
.395
.396
.397
.398
.399
.400
.401
.402
.403
.404
.405
.406
.407
.408
.409
.410
.411
.412
.413
.414
.415
.416
.417
.418
.419
.420
.421
.422
.423
.424
.425
.426
.427
.428
.429
.430
.431
.432
.433
.434
.435
.436
.437
.438
.439
.440
.441
.442
.443
.444
.445
.446
.447
.448
.449
.450
.451
.452
.453
.454
.455
.456
.457
.458
.459
.460
.461
.462
.463
.464
.465
.466
.467
.468
.469
.470
.471
.472
.473
.474
.475
.476
.477
.478
.479
.480
.481
.482
.483
.484
.485
.486
.487
.488
.489
.490
.491
.492
.493
.494
 

<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Tronquer une chaîne de caractères HTML                    */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts391-PHP.htm              */
/* Auteur         : lamogere                                                  */
/* Date édition   : 21 Mai 2008                                               */
/* Website auteur : http://www.toplien.fr/                                    */
/*                                                                            */
/******************************************************************************/


/*
 * Script base sur le parser html disponible ici :
 http://php-html.sourceforge.net/
 */

define ("NODE_TYPE_START",);
define ("NODE_TYPE_ELEMENT",1);
define ("NODE_TYPE_ENDELEMENT",2);
define ("NODE_TYPE_TEXT",3);
define ("NODE_TYPE_COMMENT",4);
define ("NODE_TYPE_DONE",5);
define ("NODE_TYPE_ELEMENT_END",6);

/**
 * Class HtmlParser.
 * To use, create an instance of the class passing
 * HTML text. Then invoke parse() until it's false.
 * When parse() returns true, $iNodeType, $iNodeName
 * $iNodeValue and $iNodeAttributes are updated.
 *
 * To create an HtmlParser instance you may also
 * use convenience functions HtmlParser_ForFile
 * and HtmlParser_ForURL.
 */
class HtmlParser {

  /**
  * Field iNodeType.
  * May be one of the NODE_TYPE_* constants above.
  */
  var $iNodeType;

  /**
  * Field iNodeName.
  * For elements, it's the name of the element.
  */
  var $iNodeName "";

  /**
  * Field iNodeValue.
  * For text nodes, it's the text.
  */
  var $iNodeValue "";

  /**
  * Field iNodeAttributes.
  * A string-indexed array containing attribute values
  * of the current node. Indexes are always lowercase.
  */
  var $iNodeAttributes;

  /**
  * Field iNodeStart.
  * The position of the first char.
  */
  var $iNodeStart;

  /**
  * Field iNodeEnd.
  * The position of the last char.
  */
  var $iNodeEnd;

  // The following fields should be 
  // considered private:

  var $iHtmlText;
  var $iHtmlTextLength;
  var $iHtmlTextIndex = ;
  var $iHtmlCurrentChar;
  var $BOE_ARRAY;
  var $B_ARRAY;
  var $BOS_ARRAY;

  var $no_comment false;

  //Liste des balises autofermantes
  var $BalisesSimples = array('hr''br''input''meta', 
                                       'link''img''area''param');

  /**
  * Constructor.
  * Constructs an HtmlParser instance with
  * the HTML text given.
  */
  function HtmlParser ($aHtmlText) {
    $this->iHtmlText $aHtmlText;
    $this->iHtmlTextLength strlen($aHtmlText);
    $this->iNodeAttributes = array();
    $this->setTextIndex ();

    $this->BOE_ARRAY = array (" ""t""r""n""=" );
    $this->B_ARRAY = array (" ""t""r""n" );
    $this->BOS_ARRAY = array (" ""t""r""n""/" );
  }

  /**
  * Method parse.
  * Parses the next node. Returns false only if
  * the end of the HTML text has been reached.
  * Updates values of iNode* fields.
  */
  function parse() {
    $this->iNodeStart $this->iHtmlTextIndex;
    $text $this->skipToElement();
    if ($text != "") {
      $this->iNodeType NODE_TYPE_TEXT;
      $this->iNodeName "Text";
      $this->iNodeValue $text;
      $this->iNodeEnd $this->iHtmlTextIndex;
      return true;
    }
    return $this->readTag();
  }

  function clearAttributes() {
    $this->iNodeAttributes = array();
  }

  function readTag() {
    if ($this->iCurrentChar != "<") {
      $this->iNodeType NODE_TYPE_DONE;
      return false;
    }
    $this->clearAttributes();
    $this->skipMaxInTag ("<"1);
    if ($this->iCurrentChar == '/') {
      $this->moveNext();
      $name $this->skipToBlanksInTag();
      if (strtolower($name) == 'script') {
        $this->no_comment false;
      }
      $this->iNodeType NODE_TYPE_ENDELEMENT;
      $this->iNodeName $name;
      $this->iNodeValue "";
      $this->skipEndOfTag();
      $this->iNodeEnd $this->iHtmlTextIndex;
      return true;
    }
    $name $this->skipToBlanksOrSlashInTag();
    if (!$this->isValidTagIdentifier ($name)) {
      $comment false;
      if ((strpos($name"!--") === ) && (!$this->no_comment)) {
        $ppos strpos($name"--"3);
        if (strpos($name"--"3) === (strlen($name) - 2)) {
          $this->iNodeType NODE_TYPE_COMMENT;
          $this->iNodeName "Comment";
          $this->iNodeValue "<" $name ">";
          $comment true;
        } else {
          $rest $this->skipToStringInTag ("-->");
          if ($rest != "") {
            $this->iNodeType NODE_TYPE_COMMENT;
            $this->iNodeName "Comment";
            $this->iNodeValue "<" $name $rest;
            $comment true;
            // Already skipped end of tag
            $this->iNodeEnd $this->iHtmlTextIndex;
            return true;
          }
        }
      }
      if (!$comment) {
        $this->iNodeType NODE_TYPE_TEXT;
        $this->iNodeName "Text";
        $this->iNodeValue "<" $name;
        $this->iNodeEnd $this->iHtmlTextIndex;
        return true;
      }
    } else {
      if (strtolower($name) == 'script') {
        $this->no_comment true;
      }
      $this->iNodeType NODE_TYPE_ELEMENT;
      $this->iNodeValue "";
      $this->iNodeName $name;
      while ($this->skipBlanksInTag()) {
        $attrName $this->skipToBlanksOrEqualsInTag();
        if ($attrName != "" && $attrName != "/") {
          $this->skipBlanksInTag();
          if ($this->iCurrentChar == "=") {
            $this->skipEqualsInTag();
            $this->skipBlanksInTag();
            $value $this->readValueInTag();
            $this->iNodeAttributes[strtolower($attrName)] = $value;
          } else {
            $this->iNodeAttributes[strtolower($attrName)] = "";
            $this->setTextIndex ($this->iHtmlTextIndex 1);
          }
        }
      }
    }
    if (($this->iHtmlText{$this->iHtmlTextIndex 1} == '/') ||
        (in_array($this->iNodeName$this->BalisesSimples))) {
      $this->iNodeType NODE_TYPE_ELEMENT_END;
    }
    $this->skipEndOfTag();
    $this->iNodeEnd $this->iHtmlTextIndex;
    return true;
  }

  function isValidTagIdentifier ($name) {
    return ereg ("^[A-Za-z0-9_-]+$"$name);
  }

  function skipBlanksInTag() {
    return "" != ($this->skipInTag ($this->B_ARRAY));
  }

  function skipToBlanksOrEqualsInTag() {
  return $this->skipToInTag ($this->BOE_ARRAY);
  }

  function skipToBlanksInTag() {
    return $this->skipToInTag ($this->B_ARRAY);
  }

  function skipToBlanksOrSlashInTag() {
    return $this->skipToInTag ($this->BOS_ARRAY);
  }

  function skipEqualsInTag() {
    return $this->skipMaxInTag ("="1);
  }

  function readValueInTag() {
    $ch $this->iCurrentChar;
    $value "";
    if ($ch == """) {
      $this->skipMaxInTag ("""1);
      $value $this->skipToInTag (""");
      $this->skipMaxInTag ("""1);
    } elseif ($ch == "'") {
      $this->skipMaxInTag ("'"1);
      $value $this->skipToInTag ("'");
      $this->skipMaxInTag ("'"1);
    } else {
      $value $this->skipToBlanksInTag();
    }
    return $value;
  }

  function setTextIndex ($index) {
    $this->iHtmlTextIndex $index;
    if ($index >= $this->iHtmlTextLength) {
      $this->iCurrentChar = -1;
    } else {
      $this->iCurrentChar $this->iHtmlText{$index};
    }
  }

  function moveNext() {
    if ($this->iHtmlTextIndex $this->iHtmlTextLength) {
      $this->setTextIndex ($this->iHtmlTextIndex 1);
      return true;
    } else {
      return false;
    }
  }

  function skipEndOfTag() {
    while (($ch $this->iCurrentChar) !== -1) {
      if ($ch == ">") {
      $this->moveNext();
      return;
      }
      $this->moveNext();
    }
  }

  function skipInTag ($chars) {
    $sb "";
    while (($ch $this->iCurrentChar) !== -1) {
      if ($ch == ">") {
        return $sb;
      } else {
        $match false;
        for ($idx = ; $idx count($chars); $idx++) {
          if ($ch == $chars[$idx]) {
          $match true;
          break;
          }
        }
        if (!$match) {
          return $sb;
        }
        $sb .= $ch;
        $this->moveNext();
      }
    }
    return $sb;
  }

  function skipMaxInTag ($chars$maxChars) {
    $sb "";
    $count = ;
    while (($ch $this->iCurrentChar) !== -&& $count++ < $maxChars) {
      if ($ch == ">") {
        return $sb;
      } else {
        $match false;
        for ($idx = ; $idx count($chars); $idx++) {
          if ($ch == $chars[$idx]) {