2009-08-10 11 views
20

Ho un database mssql in cui le mie chiavi primarie sono GUID. Sto lavorando su un'interfaccia web per l'inserimento di alcuni dati. Ho bisogno di un GUID, generato da php. Sto usando la funzione com_create_guid(). Quindi, prima di provare a inserire voglio assicurarmi che i miei parametri siano validi. Non riesco a trovare un modo per verificare se una stringa (com_create_guid() restituisce stringa) è un GUID valido.php - verificare la guida valida

risposta

27

Considerando un GUID è definito come qualcosa di simile: "A98C5A1E-A742-4808-96FA-6F409E799937" (da ciò che la pagina di wikipedia dice)

suppongo utilizzando un'espressione regolare come questo farebbe:

$guid = 'A98C5A1E-A742-4808-96FA-6F409E799937'; 
if (preg_match('/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/', $guid)) { 
    var_dump('ok'); 
} else { 
    var_dump('not ok'); 
} 

Si abbinerà per

  • 8 caratteri (sia lettere che numeri)
  • 4 caratteri
  • 4 caratteri
  • 4 caratteri
  • 12 caratteri

ogni set di caratteri di essere separati da un '-'


Considerando che si sta utilizzando com_create_guid, il controllo regex per gli optionals } e { intorno al guid, il che significa che potrebbe visualizzare anche 'ok':

$guid = '{A98C5A1E-A742-4808-96FA-6F409E799937}'; 
if (preg_match('/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/', $guid)) { 
    var_dump('ok'); 
} else { 
    var_dump('not ok'); 
} 
+1

l'espressione regolare può essere semplificata: [A-Z0-9] {8 } - (?: [A-Z0-9] {4} -) {3} [A-Z0-9] {12} –

+4

può essere reso più breve di quello che ho proposto, anzi :-) Ma penso che io ' d ancora andare con la versione "lunga", che è "più semplice/più veloce" per capire quando devi leggerlo - non sarà cha molto, ma tanto quanto le regex sono uno strumento potente, sono spesso difficili da capire per coloro che non li conoscono bene ... –

+13

I GUID non sono esadecimali? Quindi, perché abbinare su A-Z invece di A-F? O mi sto perdendo qualcosa qui? – kander

36

Ci sono alcune regole che dovrebbero essere imposte sul pattern UUID/GUID.

  • Le sole lettere valide sono a, b, c, d, e, e f.
  • 0-9 può essere sostituito con il modello di cifre \ d
  • I GUID sono spesso senza distinzione tra maiuscole e minuscole.
  • Si dispone di {entrambe parentesi} o del tutto assenti.

modelli semplificato

  • hhhhhhhhhhhh-hhhhhhhh-hhhhhhhhhhhh
  • {hhhhhhhhhhhh-hhhhhhhh-hhhhhhhhhhhh}

Espressione:

var_dump(
preg_match("/^(\{)?[a-f\d]{8}(-[a-f\d]{4}){4}[a-f\d]{8}(?(1)\})$/i", $guid) 
? "ok", "not ok"); 

Traduzione:

  1. / inizio di espressione
  2. ^ inizio della stringa
  3. (\ {)? parentesi aperta opzionale {
  4. [af \ d] {8} 8 caratteri esadecimali hhhhhhhh
  5. (- [af \ d] {4}) caratteri esadecimali 4 preceduto da cruscotto -hhhh
  6. {4} modello precedente ripetuto 4 volte
  7. [af \ d] {8} 8 caratteri esadecimali hhhhhhhh
  8. (? (1) \}) se il primo modello era presente {, quindi corrisponde chiusura tag}
  9. $ fine della stringa
  10. / vicino espressione
  11. i ignorare caso sensibilità
+1

Primo paragrafo: manca "E" :) – Basic

+0

+ errore di raggruppamento. Sembra che l'ultimo gruppo dovrebbe essere: '(? (1) \})' -> '(\})?', O anche '\}?' Dato che si tratta di un singolo carattere. –

+0

i -'s sono opzionali. – catbadger

Problemi correlati