Rev 207 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
class Surligneur {
private $texte = '';
private $tags = array();
private $nbreSurlignageMaxParMot = 1;
private $nbreSurlignageCourant = 0;
public function __construct($texte = null, $surlignageMaxParMot = null) {
if (is_null($texte) == false) {
$this->setTexte($texte);
}
if (is_null($surlignageMaxParMot) == false) {
$this->setNbreMaxSurlignageParMot($surlignageMaxParMot);
}
}
public function setTexte($txt) {
$this->texte = $txt;
}
public function setNbreMaxSurlignageParMot($nbre) {
$this->nbreSurlignageMaxParMot = $nbre;
}
public function surlignerMots($mots) {
$this->verifierTableauDeMots($mots);
$this->texte = preg_replace_callback('`<[^>]+>`', array($this, 'sauverTags'), $this->texte);
foreach ($mots as $mot) {
$this->initialiserNbreSurlignageCourant();
$this->texte = $this->surlignerMot($mot);
}
$this->texte = preg_replace_callback('`<([0-9]+)>`', array($this, 'restaurerTags'), $this->texte);
return $this->texte;
}
private function verifierTableauDeMots($mots) {
if (is_array($mots) === false) {
$message = "Surligneur::surlignerMots() n'accepte que les tableaux de mots en argument";
throw new InvalidArgumentException($message);
} else {
if (count($mots) == 0) {
$message = "Surligneur::surlignerMots() n'accepte que des tableaux contenant au moins un mot";
throw new LengthException($message);
}
}
}
private function sauverTags($match) {
$i = count($this->tags);
$this->tags[$i] = $match[0];
return '<'.$i.'>';
}
private function initialiserNbreSurlignageCourant() {
$this->nbreSurlignageCourant = 0;
}
private function surlignerMot($mot) {
$positionDebutMot = stripos($this->texte, $mot);
$longueurMot = strlen($mot);
$surlignage = $this->texte;
if ($positionDebutMot !== false) {
$this->nbreSurlignageCourant++;
if ($this->nbreSurlignageCourant <= $this->nbreSurlignageMaxParMot) {
$debut = substr($this->texte, 0, $positionDebutMot);
$milieu = substr($this->texte, $positionDebutMot, $longueurMot);
$this->texte = substr($this->texte, $positionDebutMot + $longueurMot);
$fin = $this->surlignerMot($mot);
$surlignage = $debut.$this->sauverTagSurlignage($milieu).$fin;
}
}
return $surlignage;
}
private function sauverTagSurlignage($motTrouve) {
$i = count($this->tags);
$this->tags[$i] = '<span class="surlignage">'.$motTrouve.'</span>';
return '<'.$i.'>';
}
private function restaurerTags($match) {
return $this->tags[$match[1]];
}
}
?>