Surligner un mot dans un texte HTML
Publié : janvier 20, 2004, 11:03 am
Comme vous le savez, j'ai été confronté à un problème avec le moteur de recherche sur le site lorsque je voulais surligner les expressions trouvés... En effet, un str_replace posais quelques problème notament avec les histoire de casse, et surtout, celui-ci remplaceais le texte compris dans les balises HTML un Devenait un lorsque l'on voulais surligner toto...
Bref après avoir cherché une solution avec les expressions régulières dont voici des ducumentations interessantes:
Cours sur les expressions régulières
Syntaxe des masques (cours)
syntaxe des masques (nexen)
Documentation sur preg_replace
J'ai "dévellopé" une fonction spécifique que voici:Il existe sûrment une meilleure méthode pour arriver au même résultat, c'est pour celà que je vous invite à répondre à ce topic...
Code : Tout sélectionner
<a href='toto'>toto</a>
Code : Tout sélectionner
<a href='<span style='background-color:#ffff66'>toto</span>'>toto</a>
Bref après avoir cherché une solution avec les expressions régulières dont voici des ducumentations interessantes:
Cours sur les expressions régulières
Syntaxe des masques (cours)
syntaxe des masques (nexen)
Documentation sur preg_replace
J'ai "dévellopé" une fonction spécifique que voici:
Code : Tout sélectionner
<?
/** Fonction surligner
@param $donne : chaine de caractère donnée, un texte pouvant contenir de l'HTML
@param $recherche: chaine de caractère, mot à souligner
@return une chaine de caractère au format HTML dont toutes les occurences (en ignorant la casse) de
$recherche contenus dans $donnee n'étant pas dans des balises HTML ont été surlignées*/
function surligner($donne, $recherche) {
if (strlen($recherche) == 0) return $donne;
$j = 0;
$balise = false;
$tmp = "";
$sortie = "";
for ($i = 0; $i < strlen($donne); $i++) {
//Détection de balises HTML
if (strcmp($donne[$i] ,"<")==0) {
//Début d'une balise HTML
$balise = true;
} else {
if ( ($balise) && (strcmp($donne[$i],">")==0) ) {
//Fin d'une balise HTML
$balise = false;
}
}
if (!$balise) {
//Nous ne sommes pas dans une balise
if ($j == (strlen($recherche) - 1) ) {
//Traitement du dernier élément de $recherche
if (strcmp(strtolower($recherche[$j]),strtolower($donne[$i]))==0) {
//Recherche trouvé, on surligne
$sortie .= "<span style='background-color:#ffff66'>" . $tmp . $donne[$i] . "</span>";
} else {
//Recherche non trouvé, on laisse tel quel
$sortie .= $tmp . $donne[$i];
}
//RAZ de la "recherche"
$j = 0;
$tmp = "";
} else {
//Comparaison ignorant la casse
if (strcmp(strtolower($recherche[$j]),strtolower($donne[$i]))==0) {
//construction de la chaine temporaire
$tmp .= $donne[$i];
//Avancer la recherche
$j++;
} else {
//Recherche non trouvé, on laisse tel quel
//On ajoute la chaine tmp qui peut être non vide
//cas une partie était identique à $recherche
$sortie .= $tmp . $donne[$i];
//RAZ de la "recherche"
$tmp = "";
$j = 0;
}
}
} else {
//Nous sommes dans une balise, nous ne fesons que recopier
//Recopie
$sortie .= $donne[$i];
}
}
return $sortie;
}
?>