php - проверить правильность guid - PullRequest
21 голосов
/ 10 августа 2009

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

Ответы [ 2 ]

37 голосов
/ 04 октября 2009

Есть несколько правил, которые должны быть наложены на шаблон 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. [a-f \ d] {8} 8 шестнадцатеричных символов hhhhhhhh
  5. (- [a-f \ d] {4}) 4 шестнадцатеричных символа, за которыми следует тире -hhhh
  6. {4} предыдущий шаблон повторяется 4 раза
  7. [a-f \ d] {8} 8 шестнадцатеричных символов hhhhhhhh
  8. (? (1) \}) если присутствовал первый шаблон {, то совпадать с закрывающим тегом}
  9. $ конец строки
  10. / закрыть выражение
  11. i игнорировать чувствительность к регистру
31 голосов
/ 10 августа 2009

С учетом 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, проверка регулярных выражений для дополнительных параметров } и { окружает 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');
}
...