2016-11-22 32 views
1

我正在寻找一种方法来找出哪些页面当前正在为我正在为浏览器游戏TribalWars编写的脚本打开。 URL的设置非常相似,对于知道他在做什么的人来说,这应该很容易(我明显不知道)。JavaScript找出url标记是否匹配

的URL看起来是这样的:

https://nlp2.tribalwars.nl/game.php?village=171817&screen=train 

村ID是每个村(duuh)不同,所以这块应该是某种通配符,但在年底的“训练”是我对此感兴趣,这意味着用户正在查看我希望我的脚本修改的页面。

现在我已经写/找到下面的代码:

/^\u0026.+$/ //To find the &, but it doesn't work because there is stuff in front of the & 

/^https:\/\/((nl|zz|en).*\.tribalwars\.(nl|net)\/(game.php).*)/ 
//This piece works correctly (stole it from another script), but this will trigger at every page. 

总之:我需要一个正则表达式一块可以发现,如果用户正在从正确的域页面(如上面的部分),并找出标签'火车'是否正确。

谢谢:)

回答

1

var str = 'https://nlp2.tribalwars.nl/game.php?village=171817&screen=train', 
 
    re = /(nl|zz|en).*\.tribalwars\.(nl|net)\/game\.php(\?|.*\&)screen\=train/; 
 

 
if (re.test(str)) alert('String matches');

基本上,这样做是:

  • 检查前缀,无论是NL,ZZ,或连接(如您所提供)
  • 其次是什么
  • 其次是域名tribalwars
  • 其次是它的TLD(NL或净),其次是你有兴趣/game.php
  • 页面
  • 随后无论是在案件screen一个?是第一个参数,或任何 + &如果它不是
  • 其次是screen=train

注意不要紧之前或之后,正则表达式什么来,因为我们只是没有测试y边界检查如^$

详细最后一部分:(\?|.*\&)screen\=train - 管道|手段或 - 我们检查要么一个问号\?,或*任意数目的字符,然后一个符号.*\&的。如果URL中的参数的组织方式不同,这很有用

如果查看您提供的URL,则会看到game.php后面有一些参数。参数列表以第一个参数前的?开头,之后每个参数与下一个参数分开&?village=171817&screen=train。但是,这些参数的顺序应该没有关系,因此screen参数可能是第一个参数?screen=train&village=171817,然后在该参数前加上问号而不是以&符号。所以如果screen=train是第一个,那么和game.php?之间没有任何关系。如果它不是第一个,那么在它之后可以有任意数量的参数.*后面跟着一个和号和它自己。

+0

这是解决方案。谢谢! 你有没有解释最后的正则表达式呢?我已经阅读了一些关于它,但你能为我工作这一点: (\?|。* \&)screen \ = train/ – MagicLegend

+0

我在正则表达式的最后部分添加了一些信息。 –

+0

谢谢!我现在明白了它的作用:)现在我知道这个URL总是这样的,但总有一个失败保护是很好的:) – MagicLegend

0

使用regEx的另一个选择是,您可以使用DOM和A标记为您分割网址。

好的,更新后可以做更多的url解析。查询分离器从这里得到 - 。 https://css-tricks.com/snippets/jquery/get-query-params-object/

也使它做的标签只创建一次。

例如。

window.decodeUrl = function decodeUrl(url) { 
 
    var a = document.createElement('A'); 
 
    function inner(url) { 
 
    a.href = url; 
 
    return { 
 
     protocol: a.protocol, 
 
     hostname: a.hostname, 
 
     pathname: a.pathname, 
 
     search: a.search, 
 
     params: a.search.replace(/(^\?)/,'').split("&"). 
 
      map(function(n){return n = n.split("="), 
 
      this[n[0]] = n[1],this}.bind({}))[0] 
 
    } 
 
    }; 
 
    window.decodeUrl = inner; 
 
    return inner(url); 
 
} 
 

 

 
var url = 'https://nlp2.tribalwars.nl/game.php?village=171817&screen=train'; 
 

 
var durl = decodeUrl(url); 
 

 
console.log(durl); 
 

 
console.log(
 
    'Are we game & train : ' + 
 
    ((durl.pathname === '/game.php') && 
 
    (durl.params.screen === 'train')) 
 
);

+0

好主意!但是这会检查URL中的game.php,而我正在查看screen标签是否等于'train',而不是查看URL中的村庄ID和其他标签(可能会有更多,例如:/ game.php?village = 171817&screen = train&mode = mass&) – MagicLegend

+0

哦,对..没问题。我只是更新我的答案,使更通用的网址解码器,.. – Keith

+0

该死的,这是令人印象深刻。我有很多东西要学习:)这对于这个项目的其他部分非常有用,因为'train'和'mass'之间的url参数会有所不同(这种形式是btw:'&screen = train&mode = mass&')谢谢! Wil绝对使用这段代码来完成我的项目! :) – MagicLegend

0

你就不能使用?你需要Regex吗?

var url = "https://nlp2.tribalwars.nl/game.php?village=171817&screen=train"; 
 
var urlSplit = url.split("/"); 
 
var urlSplitLast = urlSplit[urlSplit.length - 1]; 
 
var urlGet = urlSplitLast.split("&"); 
 
var urlScreen = urlGet[urlGet.length - 1]; 
 
var screen = urlScreen.split("="); 
 
var screenValue = screen[screen.length - 1]; 
 
alert(screenValue);

+0

嗯,我用正则表达式是因为它是检查当前url是否是我需要的最简单的方法。我用一个简单的if语句和location.href.match函数来检查用户当前是在哪个页面上。 – MagicLegend

0

请仔细阅读这一块,我只是继续你已经拥有的正则表达式:

var re = /^https:\/\/((nl|zz|en).*\.tribalwars\.(nl|net)\/(game.php)?.*village=(\w+)&screen=(\w+))/g; 
 
var url = "https://nlp2.tribalwars.nl/game.php?village=171817&screen=train"; 
 

 
var match = re.exec(url); 
 
var village = match[5]; 
 
var screen = match[6]; 
 
console.log("village: " + village, "screen: " + screen);

+0

嗯,很好的锻炼让我看看这种代码,但不完全是我需要的。我没有在我的问题中指定的是,正则表达式是在if语句内部检查用户是否在正确的页面上以修改某些表格内容。正则表达式已经足够我的目标:) – MagicLegend

+0

伟大的!我非常喜欢正则表达式。我很高兴你已经找到了解决问题的办法 – RizkiDPrast

+0

说实话正则表达式与子字符串比较相比非常慢,所以只要有可能,你应该使用'substr'或类似的东西。 –