我只想在具有随机子域的特定网址上调用一些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
我不知道为什么他们不匹配?除了*
之外,我已经逃脱了所有内容?
答案 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()
}