使用Regex与Javascript中的特定URL匹配

时间:2017-03-25 23:40:59

标签: javascript regex

我只想在具有随机子域的特定网址上调用一​​些Javascript:https://*.testsite123.io/testsite123/portal/#/login。到目前为止,我想出了

function escapeRegExp(str) {
  var escaped = str.replace(/([.+?^=!:${}()|\[\]\/\\])/g, "\\$1");
  console.log("escaped " + escaped);
  escaped = new RegExp(escaped);
  return escaped;
}
function matchUrl() {
  var currentUrl = window.location.toString();
  var loginUrlRegex = escapeRegExp("https://*.testsite123.io/testsite123/portal/#/login");
  return loginUrlRegex.test(currentUrl);
}

console.log("window.location " + window.location.toString());
console.log("match " + matchUrl());

https://prod.testsite123.io/testsite123/portal/#/login上执行Chrome控制台时,会产生:

window.location https://prod.testsite123.io/testsite123/portal/#/login
escaped https\:\/\/*\.testsite123\.io\/testsite123\/portal\/#\/login
match false

我不知道为什么他们不匹配?除了*之外,我已经逃脱了所有内容?

2 个答案:

答案 0 :(得分:1)

您可以使用以下函数来转义JavaScript(source)中的正则表达式:

function escapeRegExp(str) {
   return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

在你的正则表达式字符串中,你包含了一个*,可能是一个子字符串的占位符。您需要使用正确的正则表达式变体,例如[^\.]+

此外,您还在*函数中转义(不正确)escape()。您需要转义除实际正则表达式模式之外的所有内容。所以这方面的一个例子是:

var regexString = escapeRegExp("https://") + '[^\\.]+' + escapeRegExp(".testsite123.io/testsite123/portal/#/login");
var regex = new RegExp(regexString);
var result = regex.test(window.location.toString());

console.log(result);

在上面的示例中,我使用了[^\\.]+而不是[^\.]+。这种转义只是因为如果在JavaScript字符串中使用未转义的\,则会导致JavaScript错误。然后,JavaScript字符串的内容为[^\.]+(只有一个\)。这是与上面的正则表达式相同的转义。

答案 1 :(得分:0)

@ ssc-hrep3差不多了。逃避是正确的。测试应该是带有字符串的正则表达式对象,而不是带有正则表达式对象的字符串。如果您更改答案,我会将其标记为解决方案。

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

function matchUrl() {
  var currentUrl = window.location.toString();
  var loginUrl =
    escapeRegExp("https://") +
    '[^\\.]+' +
    escapeRegExp(".testsite123.io/testsite123/portal/#/login");
  loginUrl = new RegExp(loginUrl);

  return result = loginUrl.test(currentUrl);
}

if (matchUrl()) {
  //doStuff()
}