PHP & Apache - analysieren mod_rewrite URL
-
19-09-2019 - |
Frage
Ich habe Apache meinen Server konfiguriert jede Anfrage in index.php zu umleiten, so dass ich Urls wie verwenden kann:
http://www.website.com/about/us
Jetzt muss ich die URL, um analysieren, um zu bestimmen, ob jede Route existiert und was von ihr zu erwarten, so kann ich eine Datenbanktabelle legen Sie die Routen speichern und so können meine Kunden ihre Routen bearbeiten, wie sie sie gerne sein . Die Sache ist, ich bin nicht in der Lage die Analyse so weit zu tun.
Hier ist mein Code:
$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
echo 'the route doesn\'t match';
exit();
}
Es zeigt immer, dass Echomeldung auf. Was mache ich falsch?
edit:
Der Grund, warum ich regex müssen, ist wie folgt. Stellen Sie sich vor Ich habe ein URL-Segment wie:
/user/yoda
Die Regex hier wäre nützlich das erste Argument als eine Aktion oder eine Seite, und die zweite als Schlüssel zu analysieren, die nur einen bestimmten Satz von Zeichen ermöglicht, wie wenn ich erwarten wollen, in diesem Fall die zweite Paramenter nur passend „_-azAZ09“, so etwas wie diese. Mit anderen Worten, würde die Menge der Regex Ausdrücke ich auf die uri verglichen, um zu bestimmen, ob einer von ihnen die uri entspricht, und die Aktion zu bestimmen, von der auf zu nehmen. die explodieren Funktion würde mir die uri Segmente später im Code vornehmen zu bewerten, welche ich vermeiden möchte. Wenn es zum uri keine Übereinstimmung, weiterleiten immediatelly die Seite zu einem 404 ein und den Betrieb unterbrechen. Weiß nicht, ob ich mich klar gemacht ..
Lösung
Statt reguläre Ausdrücke zu verwenden, warum nicht einfach die eingehende URI geteilt?
$uri = 'about/us';
list($page, $action) = explode('/', $uri);
Wenn Sie mehr als zwei benötigen, entfernen Sie einfach die Liste:
$pagePath = explode('/', $uri);
Aber, wenn Sie bestehen auf reguläre Ausdrücke verwenden, dies zu tun:
$regex = '#(?P<page>.*)/(?P<action>.*)#';
Allerdings bietet es Ihnen nichts Besonderes, außer dass $ matches wird nun $matches['page']
und $matches['action']
enthalten - aber wenn Sie es wirklich brauchen, youcan Gebrauch list()
wie oben gezeigt
die Funktion explode Verwendung würde me bewerten die uri Segmente später in der Code, weiche ich mag
vermeiden
Statt dafür, dass die Seite gültig ist, indem es Zeichensatz, warum nicht eine Liste der gültigen Seiten Lookup-Tabelle erstellen und nur PHP in_array
verwenden, die viel schneller als ein regulärer Ausdruck ist? Extrahieren der URL-Segmente in einem Array können Sie mehrdimensionale Arrays in kürzester Zeit überprüft haben.
Andere Tipps
Ich denke, die regex durch ein Symbol umgeben werden muss; zum Beispiel '@(page(/<action>))@'
. Beispiele finden Sie in http://php.net/preg_match
Wenn Sie unbedingt einen regulären Ausdruck aus irgendeinem Grund verwenden müssen, versuchen Sie dies:
$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);
Welche Ausgänge:
array(5) {
[0]=>
string(8) "about/us"
["path"]=>
string(5) "about"
[1]=>
string(5) "about"
["action"]=>
string(2) "us"
[2]=>
string(2) "us"
}
Dies wird jedoch nur funktionieren, wenn die Pfadkomponente nur eine Ebene untergeht!