【问题标题】:How might I perform conditional replacement using JavaScript's RegExp?如何使用 JavaScript 的 RegExp 执行条件替换?
【发布时间】:2009-05-19 22:08:57
【问题描述】:

我正在尝试使用正则表达式和用 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

当然,我必须确保所有的 & 符号等也被删除。

但我希望使用一两个正则表达式来解决它,

感谢任何和所有的答案和建议!

【问题讨论】:

    标签: javascript regex replace


    【解决方案1】:
    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=[^&]+&?/, '');
    }
    

    未经测试 - 但应该做你正在寻找的。​​p>

    正则表达式:

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

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

    【讨论】:

    • 所以不推荐使用全局 String.replace?
    • el.src 是一个字符串 - 它具有通过原型链继承的 .replace() 方法。不确定“全局 String.replace()”是什么意思
    • 好吧,对不起,我的描述有点错误。我发现我没有 XML/HTML 文档,只有一个字符串,这意味着 DOM 可能不是一个选项。然后我必须将字符串转换为 XML 片段(我认为 JavaScript 可以做到这一点),但我希望不要围绕这个编写太多代码。
    • 这个字符串的用途是什么?我假设您会将此字符串插入到 DOM 中。插入后 - 它可以使用 getElementsByTagName 进行解析。为什么在插入之前需要做任何事情?
    • 我正在使用 TinyMCE (tinymce.moxiecode.com/examples/full.php) 一个在线 html 编辑器。它具有查看 HTML 源代码功能,可以让我修改文档源代码(工具栏中的 HTML 按钮) HTML 视图部分只是一个文本区域。 HTML 视图执行 getContent 将文档编辑器中的内容转换为字符串并将其加载到文本区域。我想要做的是在内容加载到 HTML 视图之前替换我的 img/@src 值。在将字符串加载到 HTML 视图(textarea)之前,我需要替换我的 src 值。
    【解决方案2】:

    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"
    

    祝你好运!

    【讨论】:

      【解决方案3】:
      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, "&");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 2012-01-16
        • 1970-01-01
        • 1970-01-01
        • 2021-02-12
        • 2016-09-25
        • 2021-01-09
        相关资源
        最近更新 更多