2009-08-10 3 views
20

У меня есть база данных mssql, в которой моими первичными ключами являются GUID. Я работаю над веб-интерфейсом для вставки некоторых данных. Мне нужен GUID, созданный php. Я использую функцию com_create_guid(). Поэтому, прежде чем пытаться вставить, я хочу убедиться, что мои параметры действительны. Я не могу найти способ проверить, является ли строка (com_create_guid()) строкой) является допустимым идентификатором GUID.php - проверка действительного guid

ответ

27

Учитывая GUID определяется как что-то вроде этого: «A98C5A1E-A742-4808-96FA-6F409E799937» (от того, что говорит страница википедии)

Я полагаю, используя регулярные выражения, как этот будет делать:

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

Это будет соответствовать для

  • 8 символов (буквы и цифры)
  • 4 символов
  • 4 символа
  • 4 символов
  • 12 символов

Каждый набор символов отделены друг от друга '-'


Учитывая вы используете com_create_guid, то regex проверить для optionnals } и { arround the guid, что означает, что это отобразит «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

Регулярное выражение может быть упрощено: [А-Z0-9] {8 } - (?: [A-Z0-9] {4} -) {3} [A-Z0-9] {12} –

+4

его можно сделать короче, чем я предложил, действительно :-) Но я думаю, d по-прежнему идет с «длинной» версией, которая «проще/быстрее», чтобы понять, когда вы должны ее прочитать - это не будет nge много, но столько, сколько регулярное выражение - мощный инструмент, их часто трудно понять для тех, кто их не знает ... –

+13

Не являются ли GUID шестнадцатеричными? Итак, почему матч на A-Z вместо A-F? Или я чего-то не хватает? – kander

36

Существует несколько правил, которые должны применяться к шаблону UUID/GUID.

  • Единственные допустимые буквы: a, b, c, d, e и f.
  • 0-9 можно заменить на цифровой рисунок \ d
  • GUID часто не учитывают регистр.
  • У вас либо есть {обе скобки}, либо вообще нет.

упрощенный узоры

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

Выражение:

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

  1. / начало выражения
  2. ^ начало строки
  3. (\ {)? опционально открывающей скобки {
  4. [аф \ д] {8} 8 шестнадцатеричных символов hhhhhhhh
  5. (- [аф \ д] {4}) 4 шестнадцатеричных символов протекала с помощью тире -hhhh
  6. {4} повторяющиеся предыдущий шаблон 4 раза
  7. [аф \ д] {8} 8 шестнадцатеричных символов hhhhhhhh
  8. (? (1) \}), если первый шаблон присутствовал {, затем матч закрытия Тег}
  9. $ конец строки
  10. / близко экспрессии
  11. я игнорировать случай чувствительности
+1

Первый пункт: «E» отсутствует :) – Basic

+0

+ Ошибка группировки. Похоже, что последняя группа должна быть: '(? (1) \})' -> '(\})?' Или даже '\}?', Поскольку это один символ. –

+0

-'s являются необязательными. – catbadger

Смежные вопросы