2009-05-19 5 views
0

Je suis en train d'envelopper ma tête autour de l'utilisation des expressions régulières et remplacer() avec JavaScript, mais pas encore réussiComment effectuer un remplacement conditionnel à l'aide de RegExp de JavaScript?

Supposons que j'ai une chaîne contenant ceci:

<img alt="a picture of ..." src="image/1533?foo=1&bar=2$zot=3" width="500" /> 

Si zot=3 Je veux supprimer foo (et sa valeur) (ou remplacez foo=x par une chaîne vide).

Le remplacement se présente comme suit:.

<img alt="a picture of ..." src="picture/1533?bar=2$zot=3" width="500" /> 

Je veux que ce soit comme épreuve des balles que possible que je ne peux jamais être sûr de commander les paramètres d'URL seront donnés dans

Est cela est-il possible en utilisant une seule regex, ou y a-t-il de meilleures solutions?

Je pensais à l'aide DOM et

  • traversant tous img nœuds
  • obtenir le src attribut
  • faire un test si @src valeur a zot=3
  • si elle a zot=3, remplacer foo=1 avec une chaîne vide

Bien sûr, je dois m'assurer que toute esperluette et ainsi de suite est enlevée aussi.

Mais j'espère le résoudre en utilisant une expression régulière ou deux,

Merci pour tout et toutes les réponses et conseils!

Répondre

2
var el = document.getElementsByTagName("img"); 
for(var i=0;i<el.length;i++) 
{ 
    if(el.src.match(/zot=3/)) 
    el.src = el.src.replace(/(?<=[?&])foo=[^&]+&?/, ''); 
} 

Untested - mais devrait faire ce que vous recherchez.

Le regexp:

  • (?<=[?&]) - zéro regard largeur derrière - une suite de caractères commençant après? ou &
  • foo=[^&]+ - correspond à 'foo =' suivi d'un nombre quelconque de caractères non &.
  • &? - match éventuellement un & si elle existe

Remplacer la chaîne assortie avec rien pour supprimer le paramètre.

+1

Donc un String.replace global n'est pas recommandé? –

+0

el.src est une chaîne - elle possède la méthode .replace() héritée de la chaîne du prototype. Pas sûr de ce que vous entendez par "global String.replace()" – gnarf

+0

Eh bien, désolé, ma description est un peu faux. J'ai trouvé que je n'ai pas un document XML/HTML, mais seulement une chaîne, ce qui signifie que DOM peut ne pas être une option. Je devrais alors faire la chaîne à un fragment XML (je pense que JavaScript peut le faire) mais j'espère ne pas trop coder autour de ça. –

0
var el = document.getElementsByTagName("img"); 
for(var i=0;i<el.length;i++) 
{ 
    if(el.src.match(/zot\=3/i)) 
     el.src=el.src.replace(/foo\=.+?\&/i, "&"); 
} 
1

Que Gnarf dit, sauf que JavaScript doesn't support regex lookbehinds (au moins mon IE et FF JavaScript implémentations ne sont pas, ou je suis copier et coller mal), je ne peux pas tester comme écrit sans exception . J'ai donc cassé l'expression en deux pour gérer les cas distincts de:

1) en commençant par?, Auquel cas?est conservé mais un & qui suit est pas, et

2) en commençant par &, auquel cas le premier & ne sont pas conservées mais un & dessous. Pendant ce temps, j'ai enlevé l'espoir que foo = sera suivi par n'importe quoi, à l'exception peut-être d'un & commençant le paramètre suivant. Notez également qu'il y a peu de pardon pour les espaces.

el.src = el.src.replace(/(\?)foo=[^&]*&?|&foo=[^&]*(&?)/, '$1$2'); 

Je l'ai testé avec ces chaînes src:

"image/1533?foo=1&bar=2$zot=3" 
"image/1533?foo=&bar=2$zot=3" 
"image/1533?bar=2$zot=3&foo=1" 
"image/1533?bar=2$zot=3&foo=" 
"image/1533?bar=2$zot=3&foo=1&another=123" 
"image/1533?bar=2$zot=3&foo=&another=123" 

et a obtenu ces résultats:

"image/1533?bar=2$zot=3" 
"image/1533?bar=2$zot=3" 
"image/1533?bar=2$zot=3" 
"image/1533?bar=2$zot=3" 
"image/1533?bar=2$zot=3&another=123" 
"image/1533?bar=2$zot=3&another=123" 

Bonne chance!

Questions connexes