Espressione regolare per effettuare match con URI

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
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:

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.
 

JackIlPazzo

Utente Attivo
25 Lug 2014
69
0
6
Dopo qualche ora di sbattimento ho quasi risolto il problema creando una funzione:

PHP:
function matchRoute($url, $pattern) 
{	
        $urlParts = array_filter(explode('/', $url));
        $patternParts = array_filter(explode('/', $pattern)); 
        
        if (count($urlParts) != count($patternParts)) 
	{
            return false;
        }

		
        for ($i = 0 ; $i < count($urlParts); $i++) 
        {
            if(!preg_match('/^' . $patternParts[$i] .'$/', $urlParts[$i]))
	    {
                return false;
            }
        }

        return true;

}

$testUri = 'transaction/19-02-2016/SomeWrongUrlRequest';
$matchUri = 'transaction/getTest/.+/categoria/.+';

echo "FALSE <BR>";
var_dump(matchRoute($testUri, $matchUri));  
echo "<br>TRUE <br>";
var_dump(matchRoute('transaction/getTests/9/categorias/5/', $matchUri));

Ora diciamo che ho raggiunto il mio scopo ma non è ancora del tutto funzionante per i seguenti motivi:

1. Se inserisco "categorias" invece di categoria l'espressione regolare va a buon fine e questo è sbagliato, dovrei fare in modo che caratteri finali che non corrispondono alla stringa facciano cadere la funzione in false e non in true. [FIXATO]
: Per risolverlo ho agginuto nel pattern "/^" e "$/"

2. array_filter comporta che se io passo come parametro lo 0 quindi: getTests/0/.. io otterrò automaticamente false

Qualche buon samaritano che mi aiuta a risolvere?

:mexican:
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
F espressione regolare per valore null PHP 8
A Espressione Regolare per verifica stringa PHP 14
A Espressione regolare per verifica password PHP 3
JellyBelly Espressione Regolare per controllo Orario Javascript 2
D Select con espressione regolare PHP 4
C L'espressione regolare non funziona Javascript 0
I espressione regolare Javascript 1
J espressione regolare PHP 2
D Espressione regolare e redirect Apache 0
S Password espressione regolare PHP 3
S Espressione Regolare PHP 7
emanuelevt espressione regolare PHP 9
borgo italia espressione regolare con numeri PHP 2
borgo italia espressione regolare PHP 4
Z Espressione regolare PHP 1
M Espressione regolare con eregi PHP 1
F espressione regolare e IE 6 Javascript 4
G [MS Access] Funzione ARROTONDA non definita nell'espressione MS Access 1
M Valutazione espressione postfissa C/C++ 0
A Creare una classe espressione Java 1
Nik Espressione regolari max e min caratteri Javascript 12
D Scrivere un'espressione condizionale in Access Visual Basic 0
L espressione aritmetica PHP 5
asevenx regolare larghezza e opacità del testo div HTML e CSS 2
V Regolare il volume Flash 1
felino Lubuntu 18.04 Requisiti per applicazione console .net core 7.0 Linux e Software 0
M pulsante per aprire una maschera che contiene controllo schede MS Access 0
E Aiuto per query PHP 8
E Il punto di riferimento italiano per Trailers cavalli Discussioni Varie 0
F CERCO Servizi SEO di Qualità per Agenzie di Servizi SEO e Posizionamento 3
D Miglior modo per estrarre le occorrenze di un elemento in un set di più file xml e quindi scrivere il risultato in una tabella Excel o magari in JSON XML 0
A Cerco programmatore/sviluppatore per creare forum Offerte e Richieste di Lavoro e/o Collaborazione 2
R Plugin di base per WordPress WordPress 0
D [COMPRO/CERCO] GUEST POST o scambio link per sito di Spiritualità ed Esoterismo. Vendere e Acquistare pubblicita' online 0
L Suggerimento Pagespeed per non vedenti HTML e CSS 0
M Analisi sito per pulire codice inutile HTML e CSS 1
Paolo69 Risolto reCAPTCHA v2 per ASP Classic ASP 0
M Hosting VPS per server di gioco Minecraft Hosting 0
N Grazie per il benvenuto Presentati al Forum 0
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
R Filtri e plugin per photoshop Photoshop 0
AkTaRuS DIsabilitare il tasto destro tranne che per code e pre Javascript 1
0 [Retribuito] Cercasi programmatore per GdR PbC Offerte e Richieste di Lavoro e/o Collaborazione 0
A Adempimenti per magazine on line Leggi, Normative e Fisco 0
R Recupero di permalink di un sito che è stato eliminato per errore WordPress 5
I aiuto urgente per thunderbird Posta Elettronica 0
A Web master per semplice sito web Offerte e Richieste di Lavoro e/o Collaborazione 2
M [Cerco][Gratuito] Artista/designer per creazione grafica gioco di società Offerte e Richieste di Lavoro e/o Collaborazione 0
M Un saluto per cominciare Presentati al Forum 1
N MAX() + ADD_DATE - per update su Mysql MySQL 0

Discussioni simili