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
MarcoGrazia Categorie per settore merceologico di Google SEO e Posizionamento 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
matteoraggi Local seo per un B&B di Forli SEO e Posizionamento 3
D Ical: Sto realizzando un gestionale per i miei appartamenti di casa vacanza PHP 0
N Non Autorizzato. Dovresti rimuovere il parametro customize_messenger_channel per visualizzare l'anteprima in frontend. WordPress 1
P Aiuto per rendere un Bot Telegram Privato PHP 1
V Query per una somma PHP 2
A Tabella con bottoni per aggiornamento record PHP 6
G Consigli SEO per scrittura e struttura pagine SEO e Posizionamento 6
P Passare solo alcuni parametri a script per CSV PHP 0
A Consiglio per creazione sito web CMS (Content Management System) 0
A Regex per isolare link interni con rel noopener PHP 0
L form immagini per il database PHP 0
S CREAZIONE DI SITO PER CORSI DI FORMAZIONE WordPress 1
I [cerchiamo][retribuito] Grafico/a per stickers Offerte e Richieste di Lavoro e/o Collaborazione 0
R Cercarsi programmatore per GDR PBC Offerte e Richieste di Lavoro e/o Collaborazione 0
L Sessione e array per utenti PHP 0
A Sottoquery con group by per mese MySQL 0
G Appicazione HTML per inserimento dai in Database Access Microsoft HTML e CSS 0
V [Cerco] Socio e Sviluppatore per App PlacesFinder Offerte e Richieste di Lavoro e/o Collaborazione 0
M user agent per il download di api PHP 0
B Stringa sql per ricerca su più campi Database 1
Cosina Upload multiplo con invio allegati per email PHP 0
P Editor per la realizzazione di siti HTML e CSS 2
M Versione nativa per M1. Photoshop 1

Discussioni simili