php - 检查有效的guid

时间:2009-08-10 06:30:26

标签: php guid

我有一个mssql数据库,其中我的主键是GUID。我正在使用Web界面插入一些数据。我需要一个由php生成的GUID。我正在使用com_create_guid()函数。因此,在尝试插入之前,我想确保我的参数有效。我找不到一种方法来检查字符串(com_create_guid()返回字符串)是否是有效的GUID。

2 个答案:

答案 0 :(得分:37)

应该对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个十六进制字符由dash -hhh
  6. 进行
  7. {4} 之前的模式重复了4次
  8. [a-f \ d] {8} 8个十六进制字符hhhhhhhh
  9. (?(1)\})如果第一个模式存在{,则匹配结束标记}
  10. $ 字符串结尾
  11. / 关闭表达
  12. 忽略区分大小写

答案 1 :(得分:31)

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