Re: [PHP] Highlighter certains termes dans une chaîne

WRInaute accro
Salut,

Je cherche à mettre en évidence les termes recherchés, dans le résultat d'une recherche.

En gros, là où:

Code:
echo $var;

me donnerait ça:

Ici sont les résultats de ma recherche

je souhaite afficher, pour une recherche sur "recherche":

Ici sont les résultats de ma recherche

J'ai essayé de faire ceci:

Code:
<style>
.highlight { color:#FF0000 }
</style>

function Highlight ($chaine,$term) {
$chaine=eregi_replace('$term','<span class="highlight">$term\</span>',$chaine);
return ($chaine);
}

echo Highlight ($var,$term);

...mais je n'obtiens aucun changement.

Quelqu'un a une idée ? (c'est probablement au niveau de la fonction que ça déconne... je suis pas encore afficionado de fonctions php) ;)

Merci !
 
WRInaute passionné
Salut,

tu peux faire ça autrement :

$var = str_replace($term, '<span class="highlight">'.$term.'</span>', $var);
 
M
mumbly
Guest
Si tu veux utiliser absolument ta fonction...
Code:
function Highlight ($chaine,$term) { 
$chaine=eregi_replace($term,'<span class="highlight">'.$term.'</span>',$chaine); 
return ($chaine); 
} 

echo Highlight ($var,$term);
 
WRInaute accro
Bon, j'ai voulu pousser plus avant...

avec la fonction ci-desus, je cherche non plus à mettre en évidence $term dans $chaine, mais le contenu de explode(' ',$term);...

Ouais, j'suis ch**** ;)

imaginons que $data est "isoler%20certains%20caractères%20dans%20un%20span"
...et que...
$chaine est certains de ces caractères sont à isoler

(le résultat devrait être: certains de ces caractères sont à isoler)


Je l'éclate et j'en fais une array de chaque terme identifié par un espace...

Code:
$data = urldecode($data);
$subdata = explode(" ", $data);

-> ('isoler','certains','caractères','dans','un','span')

J'essaye avec le code suivant:

Code:
function Highlight ($chaine,$data) {
	$data = urldecode($data);
	$subdata = explode(" ", $data);
	$nb_subdata = sizeof($subdata);

for($highlight_run=0; $highlight_run<$nb_subdata; $highlight_run++)
	{
	$chaine=eregi_replace($subdata[$highlight_run],'<span class="highlight">'.$subdata[$highlight_run].'</span>',$chaine);
	}
return ($chaine);
}

Le problème est évidemment que comme je fais un eregi_replace d'un eregi_replace, autant de fois que de termes recherchés, il me considère aussi "span" comme à remplacer par <span class="highlight">span</span>, et j'ai donc à l'écran un résultat foireux qui m'affiche des spans de spans de spans du spam de mon span...

y'a t'il un moyen de faire remplacer dans une chaine chaque contenu d'une array ( donc autant "1" que "2" dans array('1','2')) par <span>1</span> pour "1" et <span>2</span> pour "2")?

Je sais pas si tout le monde me suit...

Merci d'avance... Après j'ai fini... ;)
 
M
mumbly
Guest
Je ne suis pas sur d'avoir bien compris mais en remplacant
$nb_subdata = sizeof($subdata);
par
$nb_subdata = sizeof($subdata)-1;

ca doit etre mieux
 
WRInaute accro
$nb_subdata ne sert qu'à compter le nombre de termes différents dans l'array, pour après faire tourner autant de "highligh_runs" (et donc de eregi_replace) que de $subdata...

je pense pas que le problème soit là...

en gros je voudrais pouvoir faire un truc du genre (ce code est faux):

Code:
$chaine = "12345";
$data = array('1','3');
eregi_replace ($array,<span class="red">$array</span>,$chaine);

soit pour une chaine 12345
afficher à l'écrant 12345

'tain ça me les casse :(
 
M
mumbly
Guest
J'ai testé ta fonction en local en mettant le "-1" et j'obtiens:
certains de ces caractères sont à isoler
avec un code source:
<span class="highlight">certains</span> de ces <span class="highlight">caractères</span> sont à <span class="highlight">isoler</span>
 
WRInaute accro
certes, parceque dans $data, "span" est le dernier $subdata, donc il ne fait pas le replace de "span"...

essaye avec $data = "isoler%20certains%20caractères%20dans%20un%20span%20%marche%pas" ;)

sachant que le problème apparaît avec tout caractère ou groupe de caractères qui apparaît dans "<span class="highlight">" ou "</span>"

donc si je fais une recherche sur "bric a brac" il va me faire une chiée de <sp<span="highlight">a</span>n="highlight">bric</span> <sp<span="highlight">a</span>n="highlight> <sp<span="highlight">a</span>n="highlight">br<span="highlight">a</span>c</sp<span="highlight">a</span>n>
 
WRInaute accro
je suis pas un féru d'expressions régulières, mais HawkEye_TpfH m'a mp alors bon ...

je pense que en faisant des or (|) tu devrait pouvoir y arriver.

Code:
$str = eregi_replace("terme1|terme2|terme3", $str);

donc, il suffirait, avant, d'ajouter un str_replace des espaces en |
mais je te conseille également de supprimer les termes de moins de deux ou trois caractères ;)
 
WRInaute accro
arf... pas d'bol c'est pas ton truc :(

j'ai essayé ça:

Code:
function Highlight ($chaine,$data) {
	$data = urldecode($data);
	$subdata = explode(" ", $data);
	$subdata = eregi_replace(" ","|",$subdata);
	$nb_subdata = sizeof($subdata);
$chaine = eregi_replace($subdata,'<span class="highlight">'.$subdata.'</span>',$chaine);
return ($chaine);
}

mais ça me donne aucun résultat ($chaine s'affiche normalement quoi...)

Bon... j'vais me coucher on verra demain...
 
M
mumbly
Guest
Avec la technologie parpaing ca doit etre bon:
Code:
function Highlight ($chaine,$data) { 
   $data = urldecode($data); 
   $subdata = explode(" ", $data); 
   $nb_subdata = sizeof($subdata); 
for($highlight_run=0; $highlight_run<$nb_subdata; $highlight_run++) 
   { 
   $chaine=eregi_replace($subdata[$highlight_run],'|||'.$subdata[$highlight_run].'~~~',$chaine); 
   } 
   $chaine = str_replace (array("|||","~~~"), array("<span class=\"highlight\">","</span>"),$chaine);
return ($chaine); 
}
 
WRInaute accro
ROFLMAO...

Bon, on ne le criera pas trop fort, mais Vive la techologie parpaing !

Il reste une faille, lorsqu'une recherche est faite incluant "|" ou "~"; mais la faille n'est que "graphique", donc ça passe pour l'instant ;)

Merci mumbly !
 
WRInaute accro
haha :D
la curiosité etait trop grande.
Code:
function Highlight ($chaine,$data) {
   $data = urldecode($data);
   //$subdata = explode(" ", $data);
   $subdata = eregi_replace(" ","|",$data);
   $nb_subdata = sizeof($subdata);

	$chaine = preg_replace("#(".$subdata.")#","<span class=\"highlight\">$1</span>",$chaine);
	return ($chaine);
}

comme cela, et avec les valeurs dans la page :
Code:
$chaine = "pouet hello world hola";
$data = "pouet hola";

echo Highlight($chaine,$data);
ca fonctionne :)
 
M
mumbly
Guest
Bravo KaZhaR!
C'est autre chose que la technologie parpaing ^^

En tout cas il faut que je retienne ce coups la
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut