2017-11-23 4 views
-1

Ich habe versucht, meine eigene Route-Klasse - und ich habe heißes Problem mit dem Parsen von gültigen URLs.Parsing URL mit preg_match - regexp

Dies ist ein Beispiel url: http://localhost/app/module/command/i15

Und ich brauche jedes Element nach slash/ein zusätzliches Element in Array zu sein mit preg_match in PHP zu erstellen.

Also - für die Suche von Zahlen habe ich: ([0-9] +) Suche Strings, die Buchstaben enthält, Zeichen wie - oder _ ich habe ([^.] +) (Hier ist das Problem

) wie folgt

ganze regexp Aussehen:

(app)\/(module)\/([^.]+)\/i([0-9]+) 

i ein Array von 5 Elementen wollen, so ähnlich:

0 => app, 1=> module, 2 => command, 3 => i15 

Es wird mehr Schönheit, wenn preg_match zurückkehren wird nur so etwas wie t Hut:

0 => app, 1=> module, 2 => command, 3 => 15 (ohne I als param Identifier) ​​

mit diesem

Kann mir jemand schnell helfen mir? Ich stecke 2 Tage darin und finde keine richtige Lösung.

EDIT: Ich habe einige regexp wie vorgegeben bekam:

/app/contacts/list => (app)\/(contacts)\/([^.]+) 
/app/contacts/edit/i15 => (app)\/(contacts)\/([^.]+)\/i([\d]+) 
/app/contacts/view/i15-c2 => (app)\/(contacts)\/([^.]+)\/i([\d]+)-c([\d]+) 

Und für alle die ich verschiedene regexp bereiten wie oben. Problem Sterne, wenn ich brauche etwas zwischen zu analysieren:

/app/contacts/preview/random-name/i15-c2 

oder

/app/contacts/preview/random-name-i15-c2 

([. ^] +) Fängt auch \ (Schrägstrich) - und in obigem erstem Beispiel dieser Schrägstrich brach ganzen regexp: - (

EDIT ZWEITEN MAL :-)

habe ich einige vordefinierte regexps für einige Pfade bekam. Werfen wir einen Blick haben:

$regexp = [ 
    [0 => '(app)\/([^/]+)'], 
    [1 => '(app)\/([^/]+)\/i([0-9]+)'] 
]; 

Next i aktuelle URL überprüfen und das beste Ergebnis passen - ich weiß, was ich will, aber php nicht weiß, was Benutzer auswählen, so:

wenn ich URL mit Pfad eingeben :

app/Benutzername/i15

System, der $ regexp zeigt mir [0] ist bestes Ergebnis - was es nicht wahr ist, weil $ regexp [1] ist die besten.

Ich hoffe, das erklärt mein Problem.

+0

Mögliche Duplikate von [Wie parsen und verarbeiten Sie HTML/XML in PHP?] (Https://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in -php) – Nic3500

+0

yeah, mach keine eigene Route Klasse. Benutze einfach nikic/fastroute. – Gordon

+0

@Gordon Ich mache meine App nicht wie andere MVC (Route> Controller) - also könnte das nicht hilfreich sein. Meine Route wird in eine Datei mit speziellen Parametern umgeleitet. EDIT: finden Sie die halbe Lösung [^ /] + Vielleicht habe ich versucht, Sie alle mein Problem In Beispiel zu zeigen. –

Antwort

0

Da Sie Gruppen verwenden, um in Ihrer Regex zu erfassen, können Sie sie verwenden, um das gewünschte Array zu erstellen.Übergeben Sie eine Variable preg_match() die Gruppen zu speichern:

$components = []; 
preg_match('#(app)/(module)/([^.]+)/i([0-9]+)#', $uri, $components); 

nun das erste Element des $components ist das ganze Spiel, und dann die Gruppen.

array_shift($components); # discard first element 
+0

Vielen Dank - ich habe das, aber im Routing habe ich auch andere Pfade überprüft - also wenn Pfad definiert wird zum Beispiel: app/module/list - das oben funktioniert nicht - weil auf letzten Array Element ich ' ve sammeln liste/i15 –

+0

Sie müssten Ihre Regex entsprechend ändern, um einige Teile optional zu machen, wenn ich es richtig gemacht habe. Oder gehen Sie mit einer völlig anderen Strategie vor: Teilen Sie das URI auf '/' und analysieren Sie dann jede Komponente einzeln. Ich habe dies in sehr einfachen Szenarien von benutzerdefinierten Routern verwendet. Für etwas Komplexeres als das, es lohnt sich zu untersuchen, wie ein größerer Router funktioniert oder einfach in Ihrem Projekt, wie [nikic/FastRoute] (https://github.com/nikic/FastRoute) – sidyll

+0

Ich analysiere Code der schnellen Route - und finde eine Lösung, die nur auf halbem Wege hilft: [^ /] + - aber wenn ich den Prozentsatz des Matches errechne - diese Show ist mir nicht richtig regulär. –

0

Ok here Klasse für meinen Routing: https://gist.github.com/djmassive/d7487cef92e3adb1abf7ca31d3e96a53

ganz Magie in Methode Parst gemacht werden()

Ich habe das Hinzufügen Routings:

$route->get('(app)\/:string', [ 'schema' => '2', 'module' => 'system', 'file' => 'profile' ]); 
$route->get('(app)\/:string\/i:id', [ 'schema' => '2,3', 'module' => 'system', 'file' => 'profile', 'command' => 'view' ]); 
  • Schema definieren was ich sein will na - es kann Int, String oder Array sein.
  • Modul ist Name Ordner
  • Datei Dateiname ist
  • Befehl für Befehl show Verwendung in der Datei direkt, was ich will

Wenn ich url hatte: app/Liste - System es so lautet: $ Befehl Liste (Schema zweite Element zeigt) - arbeitet

app/username/i15 $ Befehl sollte Ansicht $ id sein sollte [username, 15]

in diesem Fall wird zuerst regexp 66% des Spiels wie die zweiten zeigen - aber zweite sollte 100%

einen Blick auf Debugging haben sein:

Checking regexp: #(app)\/([^/]+)# - to match path: app/username/i15 
Results preg_match \$matches array: 
Array ([0] => app/username [1] => app [2] => username) 
Percentage match: 66.6666666667% 

Checking regexp: #(app)\/([^/]+)\/i([\d]+)# - to match path: app/username/i15 
Results preg_match \$matches array: 
Array ([0] => app/username/i15 [1] => app [2] => username [3] => 15) 
Percentage match: 66.6666666667% 

wir sehen, dass erster regexp ist nicht gut, weil es kein drittes Element gibt.

Von dem, was ich weiß, besteht das ganze Problem hauptsächlich darin, nicht zurückzugeben, was nicht die volle Bedingung erfüllt.