php - 检查有效的 guid

2022-08-30 15:53:09

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


答案 1

应该对 UUID/GUID 模式施加一些规则。

  • 唯一有效的字母是 a、b、c、d、e 和 f。
  • 0-9 可替换为数字模式 \d
  • GUID 通常不区分大小写。
  • 您要么有{两个括号},要么根本没有。

简化的模式

  • hhhhhhhh-hhhh-hhhh-hhhh-hhhhhh
  • {hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhh}

表达:

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 个十六进制字符 hhhhhhhhhh
  5. (-[a-f\d]{4}) 4 个十六进制字符,以短划线 -hhhh 进行
  6. {4}上一个模式重复 4 次
  7. [a-f\d]{8} 8 个十六进制字符 hhhhhhhhhh
  8. (?(1)\}) 如果存在第一个模式 {,则匹配结束标记 }
  9. $字符串末尾
  10. /关闭表达式
  11. 忽略区分大小写

答案 2

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

推荐