2009-08-10 15 views
20

Ana anahtarların GUID olduğu bir mssql veritabanım var. Bazı veriler eklemek için bir web arayüzünde çalışıyorum. Php tarafından oluşturulan bir GUID'e ihtiyacım var. com_create_guid() işlevini kullanıyorum. Yani, eklemeyi denemeden önce parametrelerimin geçerli olduğundan emin olmak istiyorum. Bir dize (com_create_guid() dizgi döndürür) geçerli bir GUID olup olmadığını kontrol etmek için bir yol bulamıyorum. Bir GUID düşünüldüğündephp - geçerli guid'i denetle

cevap

27

böyle bir şey olarak tanımlanır:

(wikipedia sayfası ne diyor itibaren) "-A742-4808-96FA-6F409E799937 A98C5A1E" Ben yapacağını böyle bir regex kullanarak varsayalım:

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

O

  • 8 karakterden (harfler ve rakamlar her ikisi de)
  • için maç olacak
  • 4 karakter
  • 4 karakter
  • 4 karakter
  • 12 karakter

karakter Her sette, sen com_create_guid kullandığınız düşünüldüğünde bir '-'


ile ayrılmış olan } ve { seçenekli kurallar için regex denetimini de yapın, bu da 'ok' görüntülenecek:

$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

: [A-Z, 0-9] {8 } - (?: [A-Z0-9] {4} -) {3} [A-Z0-9] {12} –

+4

önerdiğimden daha kısa yapılabilir :-) Ama sanırım ben ' d hala okumak zorunda zaman anlamak için "basit/quickier" olan "uzun" versiyonu ile gitmek - o olmaz nge çok, ama regex kadar güçlü bir araç, onları iyi bilmeyenler için anlamak zor çoğu zaman ... –

+13

GUIDs onaltılık değil mi? Öyleyse neden A-F yerine A-Z ile eşleşiyor? Yoksa burada bir şey mi özlüyorum? – kander

36

UUID/GUID düzeninde uygulanması gereken bazı kurallar vardır.

  • Geçerli olan tek harfler şunlardır: a, b, c, d, e ve f.
  • 0-9, rakam örneğiyle değiştirilemez. \ D
  • GUID'ler genellikle büyük/küçük harf duyarlıdır.
  • Ya iki tane de {parantez} var ya da hiç yok.

basitleştirilmiş modeller

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

Ekspresyon:

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

Çeviri:

  • ^ ifade
  • ait
    1. / başlangıcı dizenin başında
    2. (\ {)? isteğe bağlı açma aparatı {
    3. [af \ d] {8} 8 onaltılık karakter hhhhhhhh
    4. (- [af \ d] {4}) 4 altıgen karakter çizgi ile devam -hhhh
    5. {4} önceki model tekrarlandı 4 kez
    6. [af \ d] {8} 8 onaltılık karakter hhhhhhhh
    7. (? (1) \}) birinci desen mevcut ise {, eşleştirmek kapatma Etiket}
    8. / yakın dize ifade
    9. Duymazlıktan durumda hassasiyeti
    10. $
    11. normal ifade basitleştirilebilir
    +1

    İlk paragraf: "E" eksik :) – Basic

    +0

    + Gruplama hatası. Son grubun şöyle olması gerektiği anlaşılıyor: '(? (1) \})' -> '(\})?', Hatta '\}?' Tek bir karakter olduğu için. –

    +0

    the -'ler isteğe bağlıdır. – catbadger

    İlgili konular