3 votes

regex dans as3 pour ignorer les correspondances avec un début de chaîne spécifique

J'ai la fonction as3 suivante qui convertit le html normal avec des liens de façon à ce que les liens soient précédés de 'event:' afin que je puisse les attraper avec un écouteur TextEvent.

protected function convertLinks(str:String):String
{
  var p1:RegExp = /href|HREF="(.[^"]*)"/gs;
  str = str.replace(p1,'HREF="event:$1"');
  return str;
}

Par exemple

<a href="http://www.somedomain.com">

est converti en

<a href="event:http://www.somedomain.com">

Cela fonctionne très bien, mais j'ai un problème avec les liens qui ont déjà été convertis.

Je dois exclure la situation où j'ai une chaîne de caractères telle que

<a href="event:http://www.somedomain.com"> 

à travers la fonction, parce que pour le moment, cela est converti en

<a href="event:event:http://www.somedomain.com">

Ce qui rompt le lien.

Comment puis-je modifier ma fonction de façon à ce que les liens avec 'event:' au début ne soient PAS mis en correspondance et restent inchangés ?

4voto

polygenelubricants Points 136838

Tout d'abord, essayer de manipuler du HTML avec des expressions rationnelles n'est peut-être pas une bonne idée.

Cela dit, selon le tableau de comparaison des saveurs sur regular-expressions.info L'expression rationnelle d'ActionScript est basée sur le moteur ECMA, qui prend en charge lookaheads .

Ainsi vous pouvez écrire ceci :

/(?:href|HREF)="(?!event:)(.[^"]*)"/

(?=…) es positif lookahead ; il affirme qu'un motif donné peut être apparié. (?!…) es négatif lookahead ; elle affirme qu'un modèle donné peut PAS être appariés.

Il convient de noter que l'inclusion de la . est très particulière. Il n'est probablement pas destiné à inclure le . puisqu'il peut correspondre à un double crochet fermant.

Notez également que j'ai corrigé le alternance pour le href/HREF en utilisant une méthode de non-capture groupe (?:…) .

C'est parce que :

  • this|that correspond soit à "this" o "that"
  • this|that thing correspond soit à "this" o "that thing"
  • (this|that) thing correspond soit à "this thing" o "that thing"

Alternativement, vous pouvez également vouloir juste activer indicateur d'intensité de cas /i qui s'occuperait de choses comme hReF o eVeNt: .

Ainsi, peut-être que votre modèle devrait juste être

/href="(?!event:)([^"]*)"/gsi

Si le lookahead n'était pas supporté, vous pouvez utiliser un en option qui correspond à event: s'il est là, en l'excluant du groupe 1, pour qu'il ne soit pas inclus lorsque vous le remplacez par un autre. $1 .

/href="(?:event:)?([^"]*)"/gsi
       \________/ \_____/
   non-capturing    group 1
     optional

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X