Interdire une chaine

Résolu
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009 - 24 sept. 2008 à 11:55
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 28 avril 2009 à 09:53
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 mars 2009 à 08:15
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
3
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
24 sept. 2008 à 16:19
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"
0
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
28 mars 2009 à 23:12
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 ;)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
29 mars 2009 à 07:25
j'ai du mal a lire

.*?

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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0

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

Posez votre question
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
30 mars 2009 à 00:48
Oui justement, tout doit etre scanner/balayé...
Je ne tient pas à ce que des liens exotiques ne soient pas prit en compte.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 avril 2009 à 10:46
c'est le '?' qui me fait m'interroger
0
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
28 avril 2009 à 09:23
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".
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 avril 2009 à 09:53
merci pour l'info, c'est bien utile.
0
Rejoignez-nous