Utilisez un navigateur moderne qui respecte votre vie privée : Téléchargez Firefox

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
Réactions :
Messages : 22221
Enregistré le : septembre 27, 2002, 9:41 pm

Surligner un mot dans un texte HTML

Message par Aurelienazerty »

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 30, 2004, 11:30 am, modifié 1 fois.
Avatar du membre
Nicolazerty
l'élu
Réactions :
Messages : 4050
Enregistré le : septembre 27, 2002, 2:59 pm

Message par Nicolazerty »

si t'as < dans le texte ca marche quand meme?
ex : RCL < OM
Résistance !
Avatar du membre
Aurelienazerty
Webmaster / Président
Réactions :
Messages : 22221
Enregistré le : septembre 27, 2002, 9:41 pm

oui

Message par Aurelienazerty »

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 ;
Avatar du membre
Aurelienazerty
Webmaster / Président
Réactions :
Messages : 22221
Enregistré le : septembre 27, 2002, 9:41 pm

ça marche bien

Message par Aurelienazerty »

ça marche bien look ici
Par contre il y a des résultats assez surprennants... J'ai dût me gourer QQ part
Avatar du membre
Aurelienazerty
Webmaster / Président
Réactions :
Messages : 22221
Enregistré le : septembre 27, 2002, 9:41 pm

correction de bug

Message par Aurelienazerty »

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...
Avatar du membre
Arken
l'élu
Réactions :
Messages : 4739
Enregistré le : septembre 27, 2002, 12:55 pm

Re: Surligner un mot dans un texte HTML

Message par Arken »

C'est corrigé ?
Répondre