Interdire une chaine [Résolu]

Signaler
Messages postés
95
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 avril 2009
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Bonjour,
J'ai un souci avec une regexp.

Je souhaite modifier des liens html si ceux-ci ne contiennent pas la class css aX :

Un lien sans class="aX" doit etre supprimer pour obtenir seulement "txt"

Il se peut que class="aX" ne soit pas tjrs à la meme place, d'autres attributs seront aussi des fois présent dans le lien.

J'ai d'ailleur réussi à faire marcher une regexp si la class était en 1er position (juste derriere ]*>(.*?)<\/a>/gi,"$2")

Je pensais que celle ci fonctionnerai :
replace(/]*(?!(class=aX|class="aX"))[^>]*>(.*?)<\/a>/gi,"$2")
et non...

Bref, j'aimerais bien comprendre comment dire en plein milieu de ma regexp qu'il ne faut pas trouver qqch !? 

8 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
tu peux utiliser :

()|(?:(.+))

la première partie permet de récupérer le lien complet, s'il contient la class aX

la seconde (après le |) simplement le texte, dans le cas contraire.

tu dois pouvoir demander de remplacer par "$1$2" puisque lorsque l'un des deux item est vide, l'autre ne l'est pas (URL ou texte)


mis au point en utilisant:
http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx
Messages postés
95
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 avril 2009

J'ai fini par faire cela, en deux regex :
replace(/]*)(class="aX"|class=aX)([^>]*)>(.*?)<\/a>/gi,'$4');
replace(/]*>(.*?)<\/a>/gi,"$1");

ça me convient, mais j'aimerais tout de meme savoir comment dire en plein milieu de ma regexp qu'il ne faut pas trouver class="aX"
Messages postés
95
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 avril 2009

J'ai cru un moment que non, et si, ta solution fonctionne !

La regex finale :
/(.*?<\/a>)|(?:(.*?)<\/a>)/gi, '$1$2'

Merci Renfield, me souviendrait de l'astuce du OU pour ce genre de cas ;)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
j'ai du mal a lire

.*?

* veut déjàdire 0 ou n occurences...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
95
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 avril 2009

Oui justement, tout doit etre scanner/balayé...
Je ne tient pas à ce que des liens exotiques ne soient pas prit en compte.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
c'est le '?' qui me fait m'interroger
Messages postés
95
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
28 avril 2009

Le ? sert à dire que ce qui le précède doit se trouver zero ou une seule fois.

Donc quand il y a .*?, on veux qu'il y est rien (si rien),
OU juste un seul gros morceau, qui va couvrir toutes les correspondance qui aurai pu etre possible jusqu'a la derniere.

AU final, ce petit .*? est fort magique et t'aideras bcp dans des balises html, ou il faut prendre assurement l'intégrité de la balise sans se gourrer.

Le .+ veux au moins un caractere hors certain endroit du lien seront des fois vide.
Et .+ commencera, s'arretera des qu'il rencontrera la balise ouvrante/fermente qu il y a dans la regex dans le texte. (exemple: [lien_aX lien_ok]'+CRLF
    +'[no fulltext]testtxtB'+CRLF;
regex1 = HTML.replace(/()|(?:(.+)<\/a>)/gi,'$1$2');
regex2 = HTML.replace(/()|(?:(.*)<\/a>)/gi, '$1$2');
regex3 = HTML.replace(/(.*?<\/a>)|(?:(.*?)<\/a>)/gi, '$1$2');
regex3 = regex3.replace(/(.*?<\/a>)|(?:(.*?)<\/a>)/gi, '$1$2'); // test a faire pour voir si il reste des liens sans class=ax
alert(regex1);
alert(regex2);
alert(regex3);
</script>

(moi aussi j'ai une interrogation, assez bizzarement, si des sauts de lignes ne sont pas fait apres chaque lien, le résultat est différent et faussé, sauf pour la regex3, le saut de ligne a l'air de bien séparé les traitement pour les autres.)

Un autre exemple plus simmple est ['"]? avec ? qui correspond donc à zero ou une fois ce qui le précede, donc une apostrophe ou une guillemet ou "rien".
Avec ['"]+, tu va rechercher au moins une apostrophe (voir plus) ou au moins une guillemet (voir plus), voir des apostrophes et guillemets, mais pas la possibilité "rien".
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
merci pour l'info, c'est bien utile.