PHP e Apache - analizzare URL mod_rewrite
-
19-09-2019 - |
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 ..
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!