【问题标题】:Regex escaping bracket in javascript not workingjavascript中的正则表达式转义括号不起作用
【发布时间】:2013-03-09 00:21:56
【问题描述】:

我有一段代码正在做一些非常奇怪的事情。

function getQuerystring(key, default_){

  if (default_==null) default_=""; 
  key = key.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
  var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
  var qs = regex.exec(window.location.href);
  if(qs == null)
    return default_;
  else
    return qs[1];
}

var isThankyou = getQuerystring('CONFIRMATION');

此函数检查参数的 URL(在本例中为 CONFIRMATION)。据我所知,一切都是正确的,但是当浏览器加载代码时,它会在控制台中引发错误。

未捕获的 SyntaxError:无效的正则表达式:缺少 /

最终,这段代码用于确定用户是否在 URL 的确认页面上。如果是,那么它会触发一些谷歌分析代码来跟踪 GA 中的电子商务购买信息。

给我带来麻烦的是:

key = key.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');

当我在浏览器中加载页面并查看源代码时,会显示以下内容:

key = key.replace(/[\[]/,'\\\[').replace(/[\/,'\\\]');

两个]]出现在前面

这是奇怪的事情。当我复制注释掉第一行的行时,不会引发错误(但]] 仍然出现):

//key = key.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
  key = key.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');

我已经尝试了所有我能想到的方法,但都没有成功,我什至尝试取消链接替换方法以防万一导致问题。

key = key.replace(/[\[]/,'\\\[');
  key = key.replace(/[\]]/,'\\\]');

这会在浏览器源中产生以下结果:

key = key.replace(/[\[]/,'\\\[');
  key = key.replace(/[\/,'\\\]');

无论如何,问题似乎在于第二个 .replace 没有转义一个 ] 甚至出于某种原因保留两个 ]]

我也尝试过清除缓存、cookie 并关闭所有插件。我在 Chrome、Firefox 和 Safari 中进行了测试,在所有 3 种浏览器上的结果都相同。

这里是你可以看到完整代码块的页面(最后在头部):https://secure2.convio.net/ccod/site/Ecommerce?store_id=2841

【问题讨论】:

  • tldr;你的输入是什么,你希望输出是什么?
  • 最终,这段代码用于确定用户是否在 URL 的确认页面上。如果是,那么它会触发一些谷歌分析代码来跟踪 GA 中的电子商务购买信息。
  • 不,我的意思是字面意思,您的意见是什么? window.location.href 有哪些可能的值?
  • secure2.convio.net/ccod/site/Ecommerce?store_id=2841 , secure2.convio.net/ccod/site/EcommerceCheckout/… ,你是这个意思吗?如果我仍然不明白这个问题,我深表歉意。

标签: javascript regex escaping


【解决方案1】:

您的代码看起来有点复杂。这里有一些更简单的:

function getQueryString(key) {
    var index, url, parts, i, subparts;
    url = window.location.href;
    index = url.indexOf("?");
    if (index === -1) {
        return null;
    }
    url = url.substr(index);
    parts = url.split("&");
    for (i = 0; i < parts.length; i += 1) {
        subparts = parts[i].split("=");
        if (subparts[0] === key) {
            return subparts[1];
        }
    }
    return null;
}

(未经测试)

【讨论】:

  • 谢谢,让我试试这个,看看它是否有效。我真的不在乎如何获取 URL 参数,只要我得到它即可:)
【解决方案2】:

这会导致错误:key = key.replace(/[\/,'\\\]'),因为您在正则表达式末尾使用反斜杠转义正斜杠,如下所示:/[\/

试试这个key = key.replace(/[\\/,'\\\]')

【讨论】:

  • 是的,我明白这就是抛出错误的原因,我不明白的是为什么当原始代码是 key = key.replace(/[]]/,'\\]' );它在浏览器中使用您上面的内容呈现。真令人沮丧。
  • 你是如何用 php 渲染 javascript 的?还是您只是使用纯 html?
  • 是的,直接 html。我实际上是直接粘贴到页面编辑器中。虽然我想得越多,我想知道是否是系统(在线捐赠平台)可能导致问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多