我如何使用JavaScript RegEx执行条件替换?

时间:2009-05-19 22:08:58

标签: javascript regex 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 个答案:

答案 0 :(得分: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=[^&]+&?/, '');
}

未经测试 - 但应该做你想要的。

正则表达式:

  • (?<=[?&]) - 零宽度看后面 - 匹配一个字符串后开始?或&amp;
  • foo=[^&]+ - 匹配'foo ='后跟任意数量的非&amp;字符。
  • &? - 可选择匹配&amp;如果存在

将匹配的字符串替换为空,以删除参数。

答案 1 :(得分:1)

gnarf说的是什么,除了JavaScript doesn't support regex lookbehinds(至少我的IE和FF JavaScript实现没有,或者我正在复制和粘贴错误),所以我无法测试它是没有例外的。所以我把表达式分成两部分来处理不同的情况:

1)以?开头,在哪种情况下?保存但是跟随&amp;不是,

2)以&amp;开头,在这种情况下,领先&amp;不是保留,而是一个跟随&amp;是

在此期间,我删除了foo =后面会有任何内容的期望,除了可能的&amp;开始下一个参数。还要注意,空白几乎没有宽恕。

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"
祝你好运!

答案 2 :(得分: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, "&");
}