Domanda

Ho apache del mio server configurato per reindirizzare ogni richiesta in index.php, in modo che posso usare URL del tipo:

http://www.website.com/about/us

Ora ho bisogno di analizzare l'url al fine di determinare se ogni percorso esiste e cosa aspettarsi da esso, in modo da poter impostare una tabella del database per salvare i percorsi e così i miei clienti possono modificare i loro percorsi come vogliono loro di essere . Il fatto è che io non sono in grado di fare il parsing finora.

Ecco il mio codice:

$uri = 'about/us';
$regex = '(page(/<action>))';
if ( ! preg_match($regex, $uri, $matches)) {
    echo 'the route doesn\'t match';
    exit();
}

Si dimostra sempre quel messaggio eco. Che cosa sto facendo di sbagliato?

modifica:

Il motivo per cui ho bisogno di regex è il seguente. Immaginate Ho un segmento url del tipo:

/user/yoda

La regex qui sarebbe utile per analizzare il primo argomento come un'azione o una pagina, e la seconda come una chiave che permetterà solo un certo insieme di caratteri, come se voglio aspettare, in questo caso, il secondo paramenter solo per corrispondenza "_-azAZ09", qualcosa di simile. In altre parole, l'insieme di espressioni regex mi avrebbe rispetto al uri al fine di determinare se qualcuno di loro corrisponde alla uri, e determinare l'azione da intraprendere da quella su. Utilizzando la funzione di esplosione mi avrebbe fatto valutare i segmenti URI più avanti nel codice, wich vorrei evitare. Se non c'è alcuna corrispondenza per l'URI, inoltrare immediatelly la pagina ad un 404 uno e rompere l'operazione. Non so se mi sono spiegato ..

È stato utile?

Soluzione

Invece di usare le espressioni regolari, perché non è sufficiente dividere l'URI in arrivo?

$uri = 'about/us';
list($page, $action) = explode('/', $uri);

Se avete bisogno di più di due, è sufficiente rimuovere la lista:

$pagePath = explode('/', $uri);

Ma, se si insistere di utilizzare espressioni regolari, questo farà:

$regex = '#(?P<page>.*)/(?P<action>.*)#';

Tuttavia, vi offre niente di speciale tranne che $ partite ora conterrà $matches['page'] e $matches['action'] - ma se si ha realmente bisogno, l'uso stagliano list() come mostrato sopra

.
  

Uso della funzione di esplosione farebbe   Mi valutare i segmenti uri più avanti in   il codice, wich vorrei evitare

Invece di fare che la pagina è valida per è set di caratteri, perché non compilare un elenco di valida tabella di pagine di ricerca e basta usare in_array di PHP, che è molto più veloce di un'espressione regolare? Estrazione dei segmenti di URL in un array vi permetterà di avere array multi-dimensionali convalidati in pochissimo tempo.

Altri suggerimenti

Credo che l'espressione regolare deve essere circondata da un simbolo; per esempio '@(page(/<action>))@'. Vedi gli esempi in http://php.net/preg_match

Se è assolutamente necessario utilizzare un'espressione regolare per qualche motivo provare questo:

$uri = 'about/us';
$regex = '~(?<path>[^/]+)/(?<action>.+)~';
var_dump($matches);

Quali uscite:

array(5) {
  [0]=>
  string(8) "about/us"
  ["path"]=>
  string(5) "about"
  [1]=>
  string(5) "about"
  ["action"]=>
  string(2) "us"
  [2]=>
  string(2) "us"
}

Tuttavia, questo funziona solo quando il componente percorso va solo verso il basso di un livello!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top