Problemi con PHP PCRE
-
21-09-2019 - |
Domanda
Sto avendo un problema con PHP PCRE, e io sono abituato a POSIX, quindi non sono troppo sicuro di quello che sto facendo male. Fondamentalmente, questa funzione è corrispondenti fino a 10 numeri separati da virgole. Tuttavia, è anche corrispondente alla sdf
stringa (e probabilmente molti altri), che non vedo il motivo di. Qualcuno mi può aiutare?
$pattern='^\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?^';
$leftcheck=preg_match($pattern, $leftmodules);
$centercheck=preg_match($pattern, $centermodules);
$rightcheck=preg_match($pattern, $rightmodules);
if(!$leftcheck OR !$centercheck OR !$rightcheck)
{
$editpage = $_SERVER['HTTP_REFERER'].'?&error=1';
die("Location:$editpage");
}
Soluzione
^\d{1,5}(, *\d{1,5}){0,9}$
Altri suggerimenti
Sto assumendo il seguente:
- spazi può essere o non essere lì.
- I numeri possono essere di qualsiasi lunghezza.
- Solo numeri, spazi e virgole di sono ammessi.
- Trailing virgole senza un numero dopo di loro sono ammessi.
- tra 1 e 10 numeri separati da virgole sono ok.
Premesso che:
$pattern = '/^(\d+,* *){1,10}$/';
opere.
Da quello che posso vedere, l'espressione regolare che hai fornito corrisponderà nulla si passa in esso. Ecco perché
\d{0,5} #\d matches any digit character, while {0,5} means the
#preceding character must be repeated between **0** and five times
Quindi, l'espressione regolare è essenzialmente corto circuito. Il motore di vedere il primo carattere della stringa e dice "è una cifra stato ripetuto 0 volte? Sì? OK, si tratta di una partita!
Credo che se il tuo numero sono separati solo da virgole qualcosa come questo dovrebbe farlo
$pattern = '^\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5}$';
È necessario contenere il modello tra due simboli uguali per essere valida. La gente di solito usano /.
$pattern = '/some pattern/';
Per abbinare il tutto si desidera avere ^ all'inizio e $ alla fine. Ottenere questo sbagliato è probabilmente il motivo per cui il vostro sdf
è stato corrispondente.
$pattern = '/^whole pattern match$/';
E 'un po' di confusione come saranno separati i numeri. E 'virgola o spazio? È sia OK? Che dire di nessuno? Ecco la mia ipotesi migliore però.
$pattern = '/^\d{,5}[, ](\d{,5}[, ]){,9}$/';