Как я могу выполнить условную замену с помощью JavaScript RegExp? - PullRequest
0 голосов
/ 20 мая 2009

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

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

<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 пустой строкой

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

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

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

Ответы [ 3 ]

2 голосов
/ 20 мая 2009
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=[^&]+&?/, '');
}

Не проверено - но следует делать то, что вы ищете.

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

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

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

1 голос
/ 20 мая 2009

Что сказал gnarf, за исключением того, что JavaScript не поддерживает регулярные выражения (по крайней мере, мои реализации 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"

Удачи!

0 голосов
/ 20 мая 2009
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, "&");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...