【问题标题】:php - check for valid guidphp - 检查有效的 guid
【发布时间】:2009-08-10 06:30:26
【问题描述】:

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

【问题讨论】:

    标签: php guid


    【解决方案1】:

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

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

    简化模式

    • hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhhh
    • {hhhhhhhh-hhhh-hhhh-hhhh-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 忽略大小写

    【讨论】:

    • 第一段:缺少“E” :)
    • +分组错误。看起来最后一组应该是:(?(1)\}) -> (\})?,甚至是 \}?,因为它是单个字符。
    • - 是可选的。
    【解决方案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');
    }
    

    【讨论】:

    • 正则表达式可以简化:[A-Z0-9]{8}-(?:[A-Z0-9]{4}-){3}[A-Z0-9] {12}
    • 它确实可以比我建议的更短 :-) 但我认为我仍然会选择“长”版本,当你必须要理解它时“更简单/更快”阅读它——它不会有太大变化,但尽管正则表达式是一个强大的工具,但对于那些不太了解它们的人来说,它们通常很难理解......
    • GUID 不是十六进制的吗?那么为什么要匹配 A-Z 而不是 A-F?还是我在这里遗漏了什么?
    • 仅十六进制,可选 {},不区分大小写:/^\{?[a-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12}\}?$/i
    • -'s 是可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2014-08-17
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多