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 ..

War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top