2009-08-10 9 views
20

J'ai une base de données mssql dans laquelle mes clés primaires sont des GUID. Je travaille sur une interface web pour l'insertion de certaines données. J'ai besoin d'un GUID, généré par php. J'utilise la fonction com_create_guid(). Donc, avant d'essayer d'insérer je veux m'assurer que mes paramètres sont valides. Je ne peux pas trouver un moyen de vérifier si une chaîne (com_create_guid() renvoie une chaîne) est un GUID valide.php - vérifie la validité du guid

Répondre

27

Considérant un GUID est défini comme quelque chose comme ceci: "A98C5A1E-A742-4808-96FA-6F409E799937" (de ce que la page wikipedia dit)

Je suppose que l'aide d'un regex comme celui-ci ferait:

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

Il correspondra à

  • 8 caractères (lettres et chiffres)
  • 4 caractères
  • 4 caractères
  • 4 caractères
  • 12 caractères

Chaque ensemble de caractères étant séparés par un '-'


Considérant que vous utilisez com_create_guid, la regex vérifier les optionnels } et { autour du guid, ce qui signifie que cela affichera aussi '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

Le regex peut être simplifiée: [A-Z0-9] {8 } - (?: [A-Z0-9] {4} -) {3} [A-Z0-9] {12} –

+4

il peut être fait plus court que ce que j'ai proposé, en effet :-) Mais je pense que je ' d aller encore avec la version "longue", qui est "plus simple/plus rapide" à comprendre quand vous devez le lire - il ne cha nge beaucoup, mais autant que regex sont un outil puissant, ils sont souvent difficiles à comprendre pour ceux qui ne les connaissent pas bien ... –

+13

Les GUID ne sont-ils pas hexadécimaux? Alors pourquoi correspondre sur A-Z au lieu de A-F? Ou est-ce que je manque quelque chose ici? – kander

36

Il existe quelques règles qui devraient être imposées sur le modèle UUID/GUID.

  • Les seules lettres valides sont a, b, c, d, e et f.
  • 0-9 peut être remplacé par le modèle de chiffres \ d
  • Les GUID sont souvent insensibles à la casse.
  • Vous avez {les deux parenthèses}, ou pas du tout.

modèles simplifiés

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

Expression:

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

Traduction:

  1. / début d'expression
  2. ^ début de la chaîne
  3. (\ {)? support d'ouverture optionnelle {
  4. [af \ d] {8} 8 caractères hexadécimaux hhhhhhhh
  5. (- [af \ d] {4}) 4 caractères hexadécimaux passe par dash -hhhh
  6. {4} motif précédent répété 4 fois
  7. [af \ d] {8} 8 caractères hexadécimaux hhhhhhhh
  8. (? (1) \}) si premier motif était présent {, correspondent alors fermeture tag}
  9. $ fin de la chaîne
  10. / expression proche
  11. i ignore la casse
+1

Premier paragraphe: "E" est manquant :) – Basic

+0

+ Erreur de groupe. Il semble que le dernier groupe devrait être: '(? (1) \})' -> '(\})?', Ou même '\}?' Car il s'agit d'un seul caractère. Les –

+0

sont facultatifs. – catbadger

Questions connexes