Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2007, 16h59   #1
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 43
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 43
Points : 36
Points : 36
Par défaut highlight /surbrillance en excluant le HTML

Bonjour,

J'ai du mal à trouver la bonne regexp pour faire du highlighting, avec les contraintes suivantes :
- il peut avoir plusieurs mots à surligner
- il faut faire abstraction des caractères spéciaux de recherche (* & + ...)
- il faut que ça soit case insensitive
- il ne faut pas faire de replace dans les balises HTML

Pour le moment j'utilise en gros la fonction suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
function surligne($champ)
{
	// $_REQUEST['keywords'] est l'expression (on peut avoir plusieurs mots) que je recherche dans $champ
 
	$needles=explode(' ',urldecode($_REQUEST['keywords']));
	$res=$champ;
	foreach($needles as $needle)
	{
		$needle=trim($needle,'*-+"&|()<>~');
		$res=eregi_replace('(.*)('.$needle.')(.*)','\1<span class="surligne">\2</span>\3',$res);
	}
	return $res;
}
Le problème est que ça ne fait le replace que sur la dernière occurence d'un keyword dans mon champ !
Si je me trompe pas, ereg_replace doit normalement remplacer toutes les occurences.

Mon deuxième problèmes concerne les balises HTML et notamment les mailto.
Par exemple si je recherche "toto" dans <a href="mailto:toto@bob.com">Toto</a> , le replace va aussi se faire dans le mailto.
J'ai tenté d'utiliser une regexp de ce type :
Code :
1
2
 
$champ=preg_replace("/(>|^)([^<]+)(?=<|$)/esx","'\\1'.str_replace('".$needle."','<span class=\"surligne\">".$needle."</span>','\\2')",$champ);
mais ce n'est pas très concluant.


Quelqu'un aurait-il une piste ??
Merci !
chicobra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2007, 20h38   #2
Modérateur
 
Avatar de Nesmontou
 
Homme Benjamin PREVOT
Architecte de système d'information
Inscription : septembre 2004
Messages : 1 570
Détails du profil
Informations personnelles :
Nom : Homme Benjamin PREVOT
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Architecte de système d'information
Secteur : Finance

Informations forums :
Inscription : septembre 2004
Messages : 1 570
Points : 2 506
Points : 2 506
Salut, j'ai testé ça vite fait, ça pourra peut-être répondre à ta question
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$string = '<p>test : ceci est un EsSaI de <a href="mailto:toto@bob.com">Toto</a></p>';
 
function highlightHtml($html) {
	$pattern = '`>([^<]+)<`i';
 
	$needles = array('test',
			 'essai',
			 'toto');
 
	foreach($needles as $needle) {
		$needle = trim($needle, '*-+"&|()<>~');
		$html   = preg_replace_callback(
					$pattern,
					create_function(
						'$matches',
						'return \'>\' . preg_replace(\'`' . $needle . '`i\', \'<span class="highlight">$0</span>\', $matches[1]) . \'<\';'
						),
					$html
					);
	}
	return $html;
}
 
echo highlightHtml($string);
?>
Bon développement
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN

F.A.Q. : Java, PHP, (X)HTML / CSS

N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème
Nesmontou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2007, 17h18   #3
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 43
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 43
Points : 36
Points : 36
Merci Nesmontou.

Ca marche plutôt bien, SAUF quand il n'y a aucune balise HTML avant la chaîne recherchée... (je sais, je suis chiant )
Bref, je vais essayer d'ajouter une alternative dans le pattern.

En tout cas je me suis penché sur les PCRE, et ça a l'air d'être carrément mieux que les POSIX (ereg, etc....). J'ai essayé de résoudre le pb en utilisant une negative lookbehind (trop fort le concept), mais sans succès.

Pour info, j'ai trouvé ce site qui est pas mal du tout : http://www.lumadis.be/regex/tuto_pcre.php
chicobra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h25.


 
 
 
 
Partenaires

Hébergement Web