2012-03-28 7 views
0

Ich versuche, einen URI in Schlüssel und Wert-Paare in einer URI-Klasse, die ich gemacht habe, zu machen. Die URIs sind sauber und können nicht in die Variable $ _GET geparst werden. Die Lösung muss innerhalb von PHP statt Apache mod_rewrite sein.Matching und Speichern mehrerer Strings in einer Zeichenfolge mit regulären Ausdrücken und PHP

Betrachten Sie diese URI:/Kategorie/Musik/rows = 30/page = 12/

Die gewünschten Schlüssel-Wert-Paare ich daraus wollen, sind diese:

Array ('Kategorie' < = 'Musik', 'Zeilen' < = '30', 'Seite' < = '12')

Um zu versuchen und zu erreichen dies schrieb ich th Beispielcode ist:

$arr = array(); 
preg_match('/(category\/(?<category>[\w-_]+)|rows=(?<rows>\d+)|page=(?<page>\d+))+/', 
     "category/music/rows=30/page=12", $arr); 
var_dump($arr); 

Ausgänge:

array 
    0 => string 'category/music' (length=14) 
    1 => string 'category/music' (length=14) 
    'category' => string 'music' (length=5) 
    2 => string 'music' (length=5) 

Das Denken war, dass ich das jedes in einer Gruppe (/ (entsprechen passen wollte | oder diese | oder dies) + /) einmal oder mehr. Ich gehe davon aus, dass das Problem hier ist, dass es einmal übereinstimmt und dann stoppt. Auch die Klammern, die die oder die Anweisung gruppieren, verursachen Übereinstimmungen, die nicht gespeichert werden müssen (die Zeichenfolge "Kategorie/Musik" ist nicht erforderlich).

Ich habe wahrscheinlich etwas offensichtlich übersehen, aber ich kann es nicht herausfinden. Ich weiß, dass ich preg_match dreimal ausführen könnte, aber es scheint, als müsste es einen Weg geben, es in einem Ausdruck zu machen. Ich möchte auch den Code kurz halten.

Edit: preg_match_all funktioniert und ich habe die Regex dies geändert: ([\ w -_] +) | (? \ D +)

/Kategorie/rows = | page = (? \ d +)/

Allerdings bekomme ich jetzt dieses Ergebnis:

array 
    0 => 
    array 
     0 => string 'category/music' (length=14) 
     1 => string 'rows=30' (length=7) 
     2 => string 'page=12' (length=7) 
    'category' => 
    array 
     0 => string 'music' (length=5) 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
    1 => 
    array 
     0 => string 'music' (length=5) 
     1 => string '' (length=0) 
     2 => string '' (length=0) 
    'rows' => 
    array 
     0 => string '' (length=0) 
     1 => string '30' (length=2) 
     2 => string '' (length=0) 
    2 => 
    array 
     0 => string '' (length=0) 
     1 => string '30' (length=2) 
     2 => string '' (length=0) 
    'page' => 
    array 
     0 => string '' (length=0) 
     1 => string '' (length=0) 
     2 => string '12' (length=2) 
    3 => 
    array 
     0 => string '' (length=0) 
     1 => string '' (length=0) 
     2 => string '12' (length=2) 

ideal wäre es, wenn es nicht auch hat speichern "Kategorie/Musik", "Zeilen + 30" , "Seite = 12". Es hat auch viele unnötige leere Zeichenfolgen gefunden.

Antwort

1

Verwenden Sie preg_match_all und sehen, ob das hilft. preg_match stoppt, nachdem die erste Übereinstimmung gefunden wurde.

Um von Spiel 1 ('Kategorie/Musik') loszuwerden, versuchen, eine nicht-einfangende Gruppe zu verwenden, so zu tun:

(?:category\/(?<category>[\w-_]+) 

statt

(category\/(?<category>[\w-_]+) 
+0

Ah ausgezeichnet, preg_match_all hat In der Tat kann ich nicht glauben, dass ich nicht erkannt habe, dass es für genau diesen Zweck gebaut wurde. Ich frage mich, ob es einen Weg gibt, es nur mit einem regulären Ausdruck zu tun. Mit preg_match_all kann ich einfach folgendes tun: '/ category \/(? [\ w -_] +) | rows = (? \ d +) | page = (? \ d +) /'. Ich bekomme immer noch Übereinstimmungen für 'Kategorie/Musik'' Zeilen = 30' und 'Seite = 12'. Ich werde weiter suchen. – Jonathan

Verwandte Themen