php - 检查有效的guid

Sve*_*lov 22 php guid

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

Lew*_*wie 39

应该对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");
Run Code Online (Sandbox Code Playgroud)

翻译:

  1. /表达的开始
  2. ^字符串的开头
  3. (\ {)?可选开口支架{
  4. [af\d] {8} 8个十六进制字符hhhhhhhh
  5. ( - [af\d] {4}) 4个十六进制字符由破折号-hhhh进行
  6. {4}之前的模式重复了4次
  7. [af\d] {8} 8个十六进制字符hhhhhhhh
  8. (?(1)\})如果存在第一个模式{,则匹配结束标记}
  9. $ end of string
  10. /关闭表达
  11. 忽略了区分大小写


Pas*_*TIN 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');
}
Run Code Online (Sandbox Code Playgroud)

它会匹配

  • 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');
}
Run Code Online (Sandbox Code Playgroud)

  • GUID是不是十六进制的?那么为什么要匹配AZ而不是AF?或者我在这里遗漏了什么? (14认同)
  • 只有hex.,可选{}',不区分大小写:`/ ^\{?[af\d] {8} - (?:[af\d] {4} - ){3} [af\d] { 12} \}?$/i` (10认同)
  • 它可以比我提议的更短,确实:-)但是我想我仍然会使用"长"版本,当你必须阅读它时,"更简单/更快"了解它 - 它不会改变很多,但正如正则表达式是一个强大的工具,他们往往很难理解那些不了解他们的人... (4认同)