【发布时间】:2009-08-10 06:30:26
【问题描述】:
我有一个 mssql 数据库,其中我的主键是 GUID。我正在开发一个用于插入一些数据的 Web 界面。我需要一个由 php 生成的 GUID。我正在使用com_create_guid() 函数。因此,在尝试插入之前,我想确保我的参数有效。我找不到检查字符串(com_create_guid() 返回字符串)是否是有效 GUID 的方法。
【问题讨论】:
我有一个 mssql 数据库,其中我的主键是 GUID。我正在开发一个用于插入一些数据的 Web 界面。我需要一个由 php 生成的 GUID。我正在使用com_create_guid() 函数。因此,在尝试插入之前,我想确保我的参数有效。我找不到检查字符串(com_create_guid() 返回字符串)是否是有效 GUID 的方法。
【问题讨论】:
应该对 UUID/GUID 模式施加一些规则。
简化模式
表达式:
var_dump(
preg_match("/^(\{)?[a-f\d]{8}(-[a-f\d]{4}){4}[a-f\d]{8}(?(1)\})$/i", $guid)
? "ok", "not ok");
翻译:
【讨论】:
(?(1)\}) -> (\})?,甚至是 \}?,因为它是单个字符。
考虑到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');
}
它将匹配
每组字符由'-'分隔
考虑到您使用的是 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-f\d]{8}-(?:[a-f\d]{4}-){3}[a-f\d]{12}\}?$/i