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

Surligner un mot dans un texte HTML

#1

Message par Aurelienazerty » 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

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.
Aurelienazerty

Image

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

#2

Message par Nicolazerty » janvier 20, 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 : 20828
Enregistré le : septembre 27, 2002, 9:41 pm

oui

#3

Message par Aurelienazerty » janvier 20, 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 : 20828
Enregistré le : septembre 27, 2002, 9:41 pm

ça marche bien

#4

Message par Aurelienazerty » janvier 25, 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 : 20828
Enregistré le : septembre 27, 2002, 9:41 pm

correction de bug

#5

Message par Aurelienazerty » janvier 30, 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 : 4501
Enregistré le : septembre 27, 2002, 12:55 pm

Re: Surligner un mot dans un texte HTML

#6

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

C'est corrigé ?

Répondre