2016-04-08 14 views
1

Ich versuche, einen Filter für eine Videoliste zu erstellen. Ich habe es geschafft, eine Zeichenfolge zu erstellen, die alle Werte enthält, die ein Benutzer zum Filtern auswählt. An dieser Stelle sende ich diese Zeichenfolge als Parameter über URL.REGEX URL (Filter) DECIPHERING

Beispiel: http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass%20hopper%20/

HINWEIS: Beachten Sie, dass der Benutzer weniger Filter können und damit die Parameter: status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass%20hopper%20, kann unterschiedlich sein, aber das obige Beispiel ist die maximale Kombination.

FRAGE: Wie bekomme ich alle Daten mit Regular Expressions (JS)?

Bevorzugtes Ergebnis: ['status=3', 'site=4', 'categories=15,2,3', 'actors=33,5,3', 'search=Grass hopper'].

Bisher habe ich das gestellt: (\w+):(((\d+),)*(\d+)|(\d+))&*, aber nicht wirklich wissen, was ich davon halten soll.

Vielen Dank im Voraus.

+0

Vielleicht, aber ich bin nicht wirklich sicher, was sie daraus zu machen. Ich probiere gerade eine Kombination aus Online-Regex-Tester aus. (\ w +): ((\ d +),) * (\ d +) | (\ d +)) & * – Nemanja

Antwort

2

Sie passen nur Ziffern mit optionalen Kommas mit Ihrer Regex, aber keine Werte wie Grass hopper.

Sie können die Schlüsselwerte in der letzten/.../ entsprechen, wo die rechte / am Ende der Schnur ist (wenn es nicht anwesend sein kann, ein ? quantifier nachdem es sollte hinzugefügt werden).

Verwenden

\w+:(?!\/\/)[^&]+(?=[^\/]*\/$) 

die regex demo See.

Erläuterung:

  • \w+: - 1+ alphanumerics oder Unterstreicht mit :
  • (?!\/\/)[^&]+ - 1+ anderen Zeichen als & aber nicht mit // Ausgang
  • (?=[^\/]*\/$) (http:// avoijd passend) - eine positive Vorausschau, um zu überprüfen, ob wir uns in der letzten /.../ befinden.

var re = /\w+:(?!\/\/)[^&]+(?=[^\/]*\/$)/g; 
 
var str = 'http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass hopper /'; 
 
var res= str.match(re); 
 
if (res) { 
 
    res = res.map(function (x) {return x.replace(":", "=")}); 
 
    document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>"; 
 
}

Eine andere Lösung ist eine Regex zu verwenden, um nur die URL Teile zu erhalten, nachdem video/ (demo)

videos\/([^\/]+) 

und spaltete dann die match[1] mit &:

var re = /videos\/([^\/]+)/; 
 
var str = 'http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass hopper /'; 
 
var m = str.match(re); 
 
var res = []; 
 
if (m) { 
 
    res = m[1].split("&"); 
 
    res = res.map(x => x.replace(":", "=")); 
 
    document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>"; 
 
}

+0

Wow, das funktioniert super. Kann nur das ':' durch '=' ersetzt werden. So würde das Ergebnis aussehen wie ["status = 3", "site = 4", "categories = 15,2,3", "actors = 33,5,36", "search = Grass trichter"] – Nemanja

+0

Sie meinen Sie müssen Sie transformieren, was Sie in der Eingabe haben, oder? Fügen Sie einfach eine 'map' mit' replace' hinein, um alle Elemente im Array zu ändern. –

+1

Das funktioniert jetzt perfekt, vielen Dank. – Nemanja