使用XPage SSJS的正则表达式替换查询字符串值

时间:2016-01-13 22:41:34

标签: regex xpages xpages-ssjs

我已将oAuth2(Facebook,LinkedIn等)与我的XPage应用程序集成,以允许身份验证轻松添加注释(响应文档)。当用户进行身份验证时,必须重定向到facebook / linkedin页面,然后返回以完成文档创建。我使用状态变量来执行此操作,并将其传递给url的查询字符串。当页面重新加载并看到状态变量时,它会调用" beforePageLoad"如果用户经过身份验证并具有正确的状态文档,则创建响应文档。

我的问题是查询字符串中已经存在状态参数。我想替换值,而不是将其添加到最后。我在这里使用了一个名为updateQueryStringParameter的ellemayo的stackOverflow解决方案。当我从我的beforePageLoads中调用它时,它会运行,但永远不会替换参数,它只会将它追加到最后。我最终得到......& state = E5A& state = E5F

我感觉它在线,

    return uri.replace(re, '$1' + key + "=" + value + '$2');

我可以使用@ReplaceSubstring()等编写代码,但想知道在XPage SSJS中运行正则表达式是否存在问题。我在Lotus.com上读到了

  

正则表达式可以指定为服务器端,它使用   Java(java.util.regex)API或客户端,它使用浏览器   JavaScript正则表达式引擎。客户端和服务器端   正则表达式语法类似,但有一点不同   用户必须知道。

我应该在XPage SSJS中避免使用正则表达式吗?我在客户端和XPage本身的一些现场验证中广泛使用它。

这是对函数的调用:

  if(@Contains( qString,"state=")){
      qString=updateQueryStringParameter(qString, "state", linkDoc.getNoteID() );
}else{
      qString="?"+qString+"&state=" + linkDoc.getNoteID()
    }

功能:

  function updateQueryStringParameter(uri, key, value) {

  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
  // I also tried --> if (re.test(uri)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}

1 个答案:

答案 0 :(得分:1)

这不是XPage或正则表达式问题。我使用Domino提供的查询字符串排除了“?”作为查询字符串的一部分。当我发送“?” + qString函数,它的工作原理。正则表达式需要知道从哪里开始查找,因此它从未找到查询字符串的开头。