Ciao a tutti, ho scritto un piccolo sistema di routing che permette di definire la logica strutturale degli URL sulla mia Rest API. Di seguito il funzionamento:
Come si può vedere `$listUri` contiene tutti gli url mappati (quelli accettabili dal sistema), in modo che io possa iterarli per fare match con l'url corrente. Abbiamo poi la variabile `$uri` che preleva l'url corrente dal browser, ora io utilizzo una semplice espressione regolare per effettuare match con l'url e dall'esempio mostrato in alto tutto funziona correttamente. Mettiamo però che si verifichi una situazione del genere:
La variabile `$listUri` contiene un "/.+" il ché significa che l'url mappato può accettare un solo parametro dopo "transaction" (come tra l'altro già mostrato nel primo esempio). Questa volta la variabile `$uri` contiene una richiesta sbagliata, come mostrato nel primo esempio infatti la richiesta è corretta, ma questa volta c'è un `user` dopo il parametro il ché è sbagliato. Perché è sbagliato? Perché in `$listUri` l'url è mappato come "transaction/.+", questo significa che se io metto ".+/user" l'echo non deve essere stampato.
Dovrei fare in modo di realizzare un'espressione regolare che mi permetta di riconoscere se ci sono ".+/" e se fanno match con l'url corrente. Ovviamente l'url è dinamico quindi bisogna creare un pattern che vada bene per tutto.
In parole povere (con un esempio):
$listUri => "transaction/.+"
Funzionamento
$uri => "transaction/19-02-2016/" (corretto)
$uri => "transaction/19-02-2016/user/prova/dd" (sbagliato - la mappatura accetta solo transaction/.+ altri parametri non devono essere presi in considerazione)"
Non so se ho reso l'idea. Spero che qualcuno mi aiuti a realizzare la regex, diciamo che non è il mio forte.
PHP:
$listUri = "transaction/.+";
$uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/'; // transaction/19-02-2016
if(preg_match("#^$listUri$#", $uri))
{
echo "done!";
}
Come si può vedere `$listUri` contiene tutti gli url mappati (quelli accettabili dal sistema), in modo che io possa iterarli per fare match con l'url corrente. Abbiamo poi la variabile `$uri` che preleva l'url corrente dal browser, ora io utilizzo una semplice espressione regolare per effettuare match con l'url e dall'esempio mostrato in alto tutto funziona correttamente. Mettiamo però che si verifichi una situazione del genere:
PHP:
$listUri = "transaction/.+";
$uri = isset($_REQUEST['uri']) ? $_REQUEST['uri'] : '/'; // transaction/19-02-2016/user
if(preg_match("#^$listUri$#", $uri))
{
echo "done!";
}
La variabile `$listUri` contiene un "/.+" il ché significa che l'url mappato può accettare un solo parametro dopo "transaction" (come tra l'altro già mostrato nel primo esempio). Questa volta la variabile `$uri` contiene una richiesta sbagliata, come mostrato nel primo esempio infatti la richiesta è corretta, ma questa volta c'è un `user` dopo il parametro il ché è sbagliato. Perché è sbagliato? Perché in `$listUri` l'url è mappato come "transaction/.+", questo significa che se io metto ".+/user" l'echo non deve essere stampato.
Dovrei fare in modo di realizzare un'espressione regolare che mi permetta di riconoscere se ci sono ".+/" e se fanno match con l'url corrente. Ovviamente l'url è dinamico quindi bisogna creare un pattern che vada bene per tutto.
In parole povere (con un esempio):
$listUri => "transaction/.+"
Funzionamento
$uri => "transaction/19-02-2016/" (corretto)
$uri => "transaction/19-02-2016/user/prova/dd" (sbagliato - la mappatura accetta solo transaction/.+ altri parametri non devono essere presi in considerazione)"
Non so se ho reso l'idea. Spero che qualcuno mi aiuti a realizzare la regex, diciamo che non è il mio forte.