Surligner un mot dans un texte HTML

Tous les benchmarks, vos résultats, vos tests.
Vos programmes, vos conseils logiciel
Votre matos, vos problèmes
Répondre
Avatar du membre
Aurelienazerty
Webmaster / Président
Messages : 19082
Enregistré le : septembre 27th, 2002, 9:41 pm

Surligner un mot dans un texte HTML

#1

Message par Aurelienazerty » janvier 20th, 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

Code : Tout sélectionner

<a href='toto'>toto</a>
Devenait un

Code : Tout sélectionner

<a href='<span style='background-color:#ffff66'>toto</span>'>toto</a>
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:

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;
}			
?>
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...
Modifié en dernier par Aurelienazerty le janvier 30th, 2004, 11:30 am, modifié 1 fois.
Aurelienazerty

Image

Avatar du membre
Nicolazerty
l'élu
Messages : 3994
Enregistré le : septembre 27th, 2002, 2:59 pm

#2

Message par Nicolazerty » janvier 20th, 2004, 2:20 pm

si t'as < dans le texte ca marche quand meme?
ex : RCL < OM
Résistance !

Avatar du membre
Aurelienazerty
Webmaster / Président
Messages : 19082
Enregistré le : septembre 27th, 2002, 9:41 pm

oui

#3

Message par Aurelienazerty » janvier 20th, 2004, 3:33 pm

Vi ça marche, car le < est codée en HTML (je sais plus ce que ça donne) enfin c'est comme le & qui est & a m p ;
Aurelienazerty

Image

Avatar du membre
Aurelienazerty
Webmaster / Président
Messages : 19082
Enregistré le : septembre 27th, 2002, 9:41 pm

ça marche bien

#4

Message par Aurelienazerty » janvier 25th, 2004, 3:19 am

ça marche bien look ici
Par contre il y a des résultats assez surprennants... J'ai dût me gourer QQ part
Aurelienazerty

Image

Avatar du membre
Aurelienazerty
Webmaster / Président
Messages : 19082
Enregistré le : septembre 27th, 2002, 9:41 pm

correction de bug

#5

Message par Aurelienazerty » janvier 30th, 2004, 11:32 am

J'eusse fait une connerie dans mon prog, c'est rectifié now...
Il reste le "bug" identifié plus haut... A savoir que si une partie du mot est mis en forme (genre une lettre en gras) ben ça merdouille...
Aurelienazerty

Image

Avatar du membre
Arken
l'élu
Messages : 4110
Enregistré le : septembre 27th, 2002, 12:55 pm

Re: Surligner un mot dans un texte HTML

#6

Message par Arken » janvier 30th, 2017, 8:29 am

C'est corrigé ?

Répondre