2016-11-22 4 views
1

Ich suche nach einer Möglichkeit, um herauszufinden, welche Seite derzeit für ein Skript geöffnet ist Ich schreibe für das Browsergame TribalWars. Die URLs sind wirklich ähnlich aufgebaut, und das sollte für jemanden, der weiß, was er tut, einfach sein (was ich natürlich nicht tue).JavaScript finden Sie heraus, wenn url-Tag übereinstimmt

Die URL sieht wie folgt aus:

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

Das ID-Dorf ist für jedes Dorf (duuh), so dass Stück eine Art Platzhalter sein sollte, aber der ‚Zug‘ am Ende, was ich interessiert mich. Das bedeutet, dass der Benutzer auf die Seite schaut, die mein Skript ändern soll.

Im Moment habe ich geschrieben habe/gefunden den folgenden Code:

/^\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. 

Kurz gesagt: Ich brauche ein Regex Stück, das, wenn der Benutzer herausfinden kann, ist an einer Seite von der richtigen Domäne suchen (wie die Stück) und findet heraus, ob das Tag 'Train' korrekt ist.

Thanks :)

Antwort

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');

Im Grunde, was das bedeutet ist:

  • Prüfung für einen Präfix, entweder nl, zz, oder en (wie Sie zur Verfügung gestellt)
  • gefolgt von was auch immer
  • gefolgt von der Domain-Name-Stämme
  • durch seine TLD gefolgt (nl oder netto)
  • von der Seite eintragen Sie in /game.php
  • Interesse gefolgt entweder durch eine ? bei screen ist der erste Parameter oder was + & wenn es nicht
  • ist, gefolgt von screen=train

Beachten sie, dass es nicht das, was vor keine Rolle kommt oder nach der RegEx, wie wir nur ohne eine Prüfung y Grenzkontrollen wie ^ oder $.

Der letzte Teil im Detail: (\?|.*\&)screen\=train - ein Rohr | Mittel OR - wir überprüfen entweder für ein Fragezeichen \? oder für * eine beliebige Anzahl von .*\& durch ein kaufmännisches gefolgt Zeichen. Dies ist nützlich, wenn die Parameter in Ihrer URL anders organisiert sind.

Wenn Sie sich die von Ihnen angegebene URL ansehen, werden Sie sehen, dass nach game.php einige Parameter darin enthalten sind. Die Liste der Parameter beginnt mit einem ? vor dem ersten Argument, und danach wird jedes Argument durch & von dem nächsten getrennt. ?village=171817&screen=train. Die Reihenfolge dieser Parameter sollte jedoch nicht von Bedeutung sein, daher ist es möglich, dass der Parameter screen der erste Parameter ?screen=train&village=171817 ist, dem dann ein Fragezeichen und nicht ein Und-Zeichen vorangestellt ist.Also, wenn zuerst ist, gibt es nichts dazwischen und game.php?. Wenn es nicht zuerst ist, kann es eine beliebige Anzahl von Parametern geben, bevor es .* gefolgt von einem Et-Zeichen und dem selbst folgt.

+0

Dies ist die Lösung. Vielen Dank! Haben Sie eine Minute zu erklären, was die Regex am Ende tut? Ich habe jetzt eine ganze Menge darüber gelesen, aber können Sie das für mich arbeiten: (\? |. * \ &) Screen \ = train/ – MagicLegend

+0

Ich habe einige Informationen über den letzten Teil der Regex hinzugefügt. –

+0

Vielen Dank! Ich verstehe jetzt, was es tut :) Jetzt weiß ich für eine Tatsache, dass die URL immer so aussehen wird, aber es ist immer schön, eine Ausfallsicherung zu haben :) – MagicLegend

0

Eine weitere Möglichkeit, RegEx zu verwenden, ist, dass Sie das DOM und ein A-Tag verwenden können, um URLs für Sie aufzuteilen.

Ok, aktualisiert, um mehr URL-Parsing zu tun. Der Abfrage-Splitter hat von hier -. https://css-tricks.com/snippets/jquery/get-query-params-object/

Auch gemacht das A-Tag wird nur einmal erstellt.

z.

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

Gute Idee! Aber das prüft auf die game.php in der URL, während ich schaue, ob das Bildschirm-Tag gleich 'train' ist, ohne auf die Dorf-ID und andere Tags in der URL zu schauen (es kann mehr geben, zum Beispiel:/game.php? Dorf = 171817 & Bildschirm = Zug & Modus = Masse &) – MagicLegend

+0

Oh, richtig .. kein Problem. Ich habe gerade meine Antwort aktualisiert, um einen generischen URL-Decoder zu machen, .. – Keith

+0

Verdammt, das ist beeindruckend. Ich habe viel zu lernen :) Das ist wirklich nützlich für einen anderen Teil dieses Projekts, weil die URL-Parameter zwischen 'train' und' mass' differieren (in dieser Form btw: '& screen = train & mode = mass &') Danke ! Wil benutzt diesen Code definitiv für mein Projekt! :) – MagicLegend

0

Kannst du nicht einfach diese nutzen? Brauchst du 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

Nun, ich habe Regex verwendet, weil es der einfachste Weg war zu überprüfen, ob die aktuelle URL die ist, die ich brauche. Ich benutze dies in einer einfachen if-Anweisung mit der Funktion location.href.match, um zu überprüfen, auf welcher Seite der Benutzer gerade ist. – MagicLegend

0

Bitte diese eine Bewertung, ich Ihre bereits regex einfach weiter:

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

Hmm, gute Übung für mich, um diese Art von Code zu sehen, aber nicht genau das, was ich brauchte. Was ich in meiner Frage nicht angegeben habe, war, dass die Regex innerhalb einer if-Anweisung war, um zu überprüfen, ob der Benutzer auf der richtigen Seite war, um einige Tabelleninhalte zu ändern. Der Regex reicht schon für mein Ziel :) – MagicLegend

+0

Toll !! Ich mag Regex so sehr für seine Leistung.Ich bin froh, dass Sie eine Lösung für das Problem gefunden haben. – RizkiDPrast

+0

Um ehrlich zu sein Regex ist sehr langsam im Vergleich zum Teilstringvergleich, also sollten Sie, wenn immer möglich, 'substr' oder ähnliches verwenden. –

Verwandte Themen