2009-08-10 34 views
20

Tengo una base de datos mssql en la cual mis claves principales son GUID. Estoy trabajando en una interfaz web para insertar algunos datos. Necesito un GUID, generado por php. Estoy usando la función com_create_guid(). Entonces, antes de intentar insertar quiero asegurarme de que mis parámetros sean válidos. No puedo encontrar una manera de verificar si una cadena (com_create_guid() devuelve cadena) es un GUID válido.php - compruebe si hay una guía válida

Respuesta

27

Considerando un GUID se define como algo parecido a esto: "A98C5A1E-A742-4808-96FA-6F409E799937" (de lo que dice la página de Wikipedia)

supongo usando una expresión regular como éste haría:

$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'); 
} 

a las coincidencias de

  • 8 caracteres (letras y números)
  • 4 caracteres
  • 4 caracteres
  • 4 caracteres
  • 12 caracteres

cada conjunto de caracteres separados por un '-'


Teniendo en cuenta que está utilizando com_create_guid, la la comprobación de expresiones regulares para las opciones } y { alrededor de la guía, lo que significa que esto también mostrará '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

la expresión regular se puede simplificar: [A-Z0-9] {8 } - (?: [A-Z0-9] {4} -) {3} [A-Z0-9] {12} –

+4

se puede hacer más corto de lo que propuse, de hecho :-) Pero creo que ' Todavía sigo con la versión "larga", que es "más simple/más rápida" para entender cuándo tiene que leerla, no lo hará nge mucho, pero tanto como regex son una herramienta poderosa, a menudo son difíciles de entender para aquellos que no los conocen bien ... –

+13

¿Los GUID no son hexadecimales? Entonces, ¿por qué combinar en A-Z en lugar de A-F? ¿O me estoy perdiendo algo aquí? – kander

36

Existen algunas reglas que deben imponerse en el patrón UUID/GUID.

  • Las únicas letras válidas son a, b, c, d, ey f.
  • 0-9 se puede reemplazar con el patrón de dígitos \ d
  • Los GUID son a menudo insensibles a las mayúsculas y minúsculas.
  • Tiene {dos corchetes} o ninguno.

patrones simplificado

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

Expresión:

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

Traducción:

  1. / comienzo de la expresión
  2. ^ comienzo de cadena
  3. (\ {)? corchete de apertura opcional {
  4. [af \ d] {8} 8 caracteres hexadecimales hhhhhhhh
  5. (- [af \ d] {4}) caracteres 4 hexagonales procedió por dash -hhhh
  6. {4} patrón anterior repitió 4 veces
  7. [af \ d] {8} 8 caracteres hexadecimales hhhhhhhh
  8. (? (1) \}) si primer patrón estaba presente {, a continuación, coincide con cierre tag}
  9. $ final de la cadena
  10. / cerca expresión
  11. i ignorar mayúsculas y minúsculas
+1

Primer párrafo: "E" falta :) – Basic

+0

+ Error de agrupación. Parece que el último grupo debería ser: '(? (1) \})' -> '(\})?', O incluso '\}?' Ya que es un solo carácter. –

+0

the -'s son opcionales. – catbadger

Cuestiones relacionadas