我正试图用正则表达式和用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
替换为空字符串当然,我必须确保删除任何&符号等。
但我希望使用一两个正则表达式来解决它,
感谢您提供的所有答案和建议!
答案 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, "&");
}