cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 2013
-
18 juil. 2009 à 19:16
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
23 juil. 2009 à 01:05
Bonjour.
Voici la regex qui me pose problème :
var regex = new RegExp(">([^<]*)?("+searchTerms[i]+")([^>]*)?<","ig");
Cette (Ce ?) regex récupère le mot identifié par la variable searchTerms[i] tant qu'il n'est pas inclus dans des balises html.
Cela marche à peu près sauf lorsque j'ai deux occurences du mot cherché non séparées par des balises html.
Exemple si on cherche le mot handicap dans le texte ci-dessous :
La Convention des Nations-Unies sur les Droits des Personnes Handicapées : Impact et opportunités pour les Personnes Handicapées dans les pays en développement
Au lieu de retourner les deux occurences, le regex retourne seulement la dernière !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juil. 2009 à 13:46
possible d'utiliser:
(<[^>]+?handicap.*?>|handicap)
en utilisant:
$1
ca transformera
La Convention des Nations-Unies sur les Droits des Personnes Handicapées : Impact et opportunités pour les Personnes Handicapées dans les pays en développement
[handicap page sur les handicap des handicapés]
en
La Convention des Nations-Unies sur les Droits des Personnes Handicapées : Impact et opportunités pour les Personnes Handicapées dans les pays en développement
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 juil. 2009 à 09:30
>([^<]*)?(handicap)([^>]*)?
donc:
> ce caractère présent, tu exclus peut etre des occurrences, donc.
([^<]*)? de 0 à n caractères, s'il ne s'agit pas d'un <
handicap, le mot recherché.
([^>]*)? de 0 à n caractère, s'il ne s'agit pas de >
GAFFE à ne pas confondre
([^<]*)? et ([^<]*?)
le second force le passage en mode "non-glouton"... et va selectionner le minimum de texte.
Dans le cas contraire, le moteur cherche a selectionner le texte le plus long, et donc va cibler le mot 'handicap' le plus tard dans le texte, puisque la condifion [^<]* est remplie...
La Convention des Nations-Unies sur les Droits des Personnes Handicapées : Impact et opportunités pour les Personnes Handicapées dans les pays en développement
> (le > qui suit le du
dans ma regexp:
<[^>]*?handicap.*?>|handicap
on a :
<[^>]*?handicap.*?>
une balise contenant le mot handicap
OU le mot handicap, dans le texte
sachant que l'expression qui extraie le plus de texte sera retenue, faire:
handicap|<[^>]*?handicap.*?>
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 20 juil. 2009 à 12:03
Ca peut être une solution... Mais j'aimerais quand même comprendre d'où vient le problème !! Est-ce que c'est mon regex qui pose problème ? Est-ce que ca peut venir d'ailleurs (dans mon code javascript j'imagine) ?
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 20 juil. 2009 à 12:12
En fait je ne pense pas que ce soit possible de supprimer les balises html car mon code récupere le contenu de la page avec les balises pour pouvoir rajouter d'autres balises lorsque l'on trouve le mot de la recherche.
Pour plus d'infos, voici le petit bout de code javascript correspondant :
//colore les mots envoyés en parametre
function highlightTextNodes(element, regex)
{
//recuperer le contenu de l'élément avec les balises html incluses
var tempinnerHTML = element.innerHTML;
// dans cet élément on rajoute notre class"couleur_rech" pour colorer le ou les mots cherchés
element.innerHTML = tempinnerHTML.replace(regex,'>$1$2$3<');
}
Ici "element" correspond à une partie de ma page délimitée par une balise html dont l'id est "zone_recherche" et regex correspond au regex que j'ai donné au tout premier message.
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 20 juil. 2009 à 15:37
Alors là je suis bluffé !! Parce que ca marche !!!
Voila ce que j'ai changé en m'inspirant de ta proposition :
var regex = new RegExp("<[^>]+?"+searchTerms[i]+".*?>|("+searchTerms[i]+")","ig");
Eu un peu plus loin, au moment du remplacement :
element.innerHTML = tempinnerHTML.replace(regex,'$1');
Là faut qu'on m'explique car :
1/la 1ere partie de ton code (avant le "|") est faite pour prendre le mot cherché même s'il est à l'intérieur de balises html -et ce n'est pas ce que je veux !! C'est pour cela que j'ai mis la parenthese uniquement sur la 2eme partie, sans vraiment savoir ce que je faisais ...
2 / je ne vois pas ce qui fait que cette fois ci cette regex considére toutes les occurrences entre l'ouverture et la fermeture d'1 seule et même balise html et non plus seulement la derniere...
Enfin puisqu'elle est de toi, cette regex, tu dois probablement avoir une explication.
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 20 juil. 2009 à 16:59
Soit je suis un vrai soit t'as un niveau 1000 fois superieur au mien (soit les 2) parce franchement...
je ne comprends pas ton explication!!
Quand tu dis "le moteur de regexp selectionne toujours l'expression la plus longue", c'est par rapport au "|" ??
Moi, ce que je comprends de ta regex, c'est que avant le "|" c'est pour les mots à l'intérieur des balises comme et apres le "|" c'est pour les mots à l'extérieur genre handicap
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 juil. 2009 à 21:42
le tout premier caractère > dans ta regexp ajoute l'obligation d'avoir un tag HTML qui ferme.
d'autre part, tu as la detection de la balise, rendue optionnelle, et d'importance moindre (le ? )
du coup, le moteur tend a ne selectionner que le mot recherché, ignorant les balises.
en gros, ta regexp etait donc :
>[^<]+handicap
comme tu le vois, elle ne conviens pas tout a fait.
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 20 juil. 2009 à 23:02
Autant la regex que tu m'as donnée je la comprends elle est tres habile autant mon erreur sur ma regex je vois toujours pas.
Tu veux dire que le "?" n'était pas nécessaire?
Pourquoi le "*" devient "+" dans >[^<]+handicap ??
Et pourquoi ca ne permettrait d'avoir que la derniere occurence ? Pourquoi pas que la premiere tant q'on y est !!
Désolé mais je dois avouer que les regex, c'est dur !. Bon c'est la premiere fois que je les vois aussi c'est pour ca. J'ai pas d'entraînement...
cs_romain117
Messages postés53Date d'inscriptionlundi 29 juin 2009StatutMembreDernière intervention21 juillet 20131 21 juil. 2009 à 09:18
Alors, pour ma regex, si je comprends bien, ca veut dire que [^<]* ne sers à rien !! L'objectif était justement d'exclure le mot s'il était à l'intérieur d'une balise mais la ca l'autorise puisqu'on a "*". Ce qui veut dire que si le mot cherché correspond à une balise html, ca va faire un affichage bizarre (voire planter ??)