Les motifs ne sont pas tous pris en compte !!

Résolu
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 - 18 juil. 2009 à 19:16
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 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 !


Avez vous la solution au problème ??


Merci d'avance pour votre aide .

39 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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

[handicap page sur les handicap des handicapés]


Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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.*?>

donnerait le même résultat.



Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2009 à 10:27
Après test, je m'apercois que je t'ai dit des bétises...

en entrée: abcd

a|ab => a

ab|a => ab

l'ordre importe donc grandement...


Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 juil. 2009 à 15:20
TROUVE !!!!



handicap(?![^<]*?>)


comme quoi, l'acharnement ^^

Renfield - Admin CodeS-SourceS - MVP Visual Basic
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 juil. 2009 à 15:21
pour info, j'ai fais tous ces tests avec mon outil:

http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx


Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 juil. 2009 à 22:27
handicap(?!XXXXXX)

ici, on recherche handicap, si XXXXXX n'est pas validée

XXXXXX ici est donc une instruction qui dit :

tout caractère sauf une ouverture de balise < (ce qui se traduit par [^<]*? )
jusqu'a trouver une fermeture de balise >

du coup, on cherche handicap, si on ne troue pas derriere de balise fermante avant une balise ouvrante: si handicap n'est pas dans une balise HTML

Renfield - Admin CodeS-SourceS - MVP Visual Basic
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 juil. 2009 à 11:44
N'est-ce pas plus simple de supprimer au préalable les balises HTML ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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) ?
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 juil. 2009 à 12:05
le probleme viens de la regexp, oui, mais il n'est pas aisé de la corriger cependant

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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.

Si ca peut aider...
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
20 juil. 2009 à 12:14
Si on peut passer par une autre solution, je suis preneur !
Plus c'est facile et mieux j'aime !!
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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.


Quoiqu'il en soit, merci bÔcoup.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 juil. 2009 à 16:12
le moteur de regexp selectionne toujours l'expression la plus longue.

ainsi, il favorisera à handicap tout seul au milieur d'un texte.

ainsi, on applique la transformation sur la balise HTML totale, ou le mot trouvé seul.... mais pas au mot trouvé dans une balise.


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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



C'est grave docteur ??
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 juil. 2009 à 19:54
oui, c'est bien ce que tu as dit.

le or | permet de dire de selectionner l'un ou l'autre...

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
20 juil. 2009 à 20:27
Ok alors ca veut dire que j'ai compris .Cooooooooool !!

Mais je t'avoues que je suis très curieux de comprendre pourquoi la ca marche alors que ca ne marchait qu'à moitié avec la première regex .

Éclaire-moi s'il te plaît histoire que je puisse apprendre de mon erreur

Merci encore pour le temps que tu me consacres... je te rassure on arrive à la fin je le sens
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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.


Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 juil. 2009 à 08:35
paraphrasons nos regexp.

tu dis:
selectionne mon mot, même si inclus dans une balise HTML

je dis:
selectionne mon mot si seul, ou la balise HTML complète si trouvé dans une balise

Renfield - Admin CodeS-SourceS - MVP Visual Basic
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
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 ??)
0
Rejoignez-nous