2009-05-19 2 views
0

Я пытаюсь обернуть вокруг головы с помощью регулярных выражений и заменить() с JavaScript, но до сих пор не увенчались успехомКак я могу выполнить условную замену с помощью JavaScript RegExp?

Предположим, что у меня есть строка, содержащая это:

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

Если zot=3 я хочу удалить foo (и его значение) (или заменить foo=x пустой строкой).

Замена будет выглядеть следующим образом:.

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

Я хочу, чтобы это было в пуленепробиваемыми, насколько это возможно, как я никогда не может быть уверен, в каком порядке параметры URL будут приведены в

ли это возможно с использованием одного регулярного выражения, или есть ли лучшие решения?

Я думал об использовании DOM и

  • обхода всех img узлов
  • получить src атрибут
  • сделать тест, если @src значения имеет zot=3
  • , если он имеет zot=3 заменить foo=1 с пустая строка

Конечно, я должен убедиться, что любые амперсанды и т. Д. Тоже удалены.

Но я надеюсь, что решить ее с помощью регулярных выражений или два,

Спасибо за любые ответы и советы!

ответ

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 - но должен делать то, что вы ищете.

Регулярное выражение:

  • (?<=[?&]) - нулевой ширины взгляд сзади - соответствует строке, начиная после? или &
  • foo=[^&]+ - соответствует «foo =», за которым следует любое количество символов не &.
  • &? - необязательно соответствовать &, если он существует

Заменить найденную строку с ничего, чтобы удалить параметр.

+1

Значит, глобальное значение String.replace не рекомендуется? – 2009-05-19 22:24:14

+0

el.src - это String - он имеет метод .replace(), унаследованный через цепочку прототипов. Не уверен, что вы подразумеваете под «global String.replace()» – gnarf

+0

Ну, извините, мое описание немного не так. Я обнаружил, что у меня нет XML/HTML-документа, но есть только строка, что означает, что DOM может быть не вариантом. Я должен был бы сделать строку XML-фрагменту (я думаю, JavaScript может это сделать), но я надеюсь, что не будет кодовым для этого. – 2009-05-19 22:34:58

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

Что gnarf сказал, за исключением того, что JavaScript doesn't support regex lookbehinds (по крайней мере, мой IE и FF JavaScript реализаций этого не сделать, или я копируя и вставляя неправильно), поэтому я не могу проверить это, как написано без исключения , Таким образом, я сломал выражение по двум, чтобы обрабатывать отдельные случаи:

1) начиная с?, В этом случае?сохраняется, но следующий & нет, и

2), начиная с &, и в этом случае ведущий & не сохраняется, но следующий & есть.

В то время как на нем я удалил ожидание, что за foo = будет следовать что-либо, кроме, возможно, &, начиная со следующего параметра. Обратите также внимание на то, что для пробелов мало прощения.

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

Я тестировал его с этими строками 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" 

И получил следующие результаты:

"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" 

Успехов!

Смежные вопросы