我有一个包含 UUID v4
的字符串$uuid = 'http://domain.com/images/123/b85066fc-248f-4ea9-b13d-0858dbf4efc1_small.jpg';
我如何使用
b85066fc-248f-4ea9-b13d-0858dbf4efc1
从上面获得 preg_match()
值?$uuid = 'http://domain.com/images/123/b85066fc-248f-4ea9-b13d-0858dbf4efc1_small.jpg';
preg_match('!/images/\d+/([a-z0-9\-]*)_!i', $uuid, $m);
还有
preg_match('/[a-f0-9]{8}\-[a-f0-9]{4}\-4[a-f0-9]{3}\-(8|9|a|b)[a-f0-9]{3}\-[a-f0-9]{12}/', $uuid, $m);
也有效。取自here,但我不知道我们是否可以依赖它。
您可以尝试这个简单的 uuid 模式
preg_match('/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/',$uuid,$matches);
接受的答案有几个缺陷:
有关 v4 UUID 允许的表示形式的详细信息,请参阅维基百科。
满足上述要求的正则表达式检查是:
preg_match(/(?i)[a-f0-9]{8}[\-]?[a-f0-9]{4}[\-]?4[a-f0-9]{3}[\-]?(8|9|a|b)[a-f0-9]{3}[\-]?[a-f0-9]{12}/, $uuid, $matches);
此选项可以满足大多数情况,但是更彻底的版本将解决以下缺陷:
nil
UUID(全部 0
)或 max
UUID(全部 F
){...}
)也满足这些要求的正则表达式检查是:
preg_match(/(?i){?[a-f0-9]{8}[\-]?[a-f0-9]{4}[\-]?(4[a-f0-9]{3}|[0]{4}|[F]{4})[\-]?((8|9|a|b)[a-f0-9]{3}|[0]{4}|[F]{4})[\-]?[a-f0-9]{12}}?/, $uuid, $matches);
这些片段的意思是:
(?i)
:强制不区分大小写{?
:0 或 1 个左大括号[a-f0-9]{8}
:允许 8 个字符[\-]?
:0 或 1 个破折号[a-f0-9]{4}
:允许 4 个字符[\-]?
:0 或 1 个破折号(4[a-f0-9]{3}|[0]{4}|[F]{4})
:4 后跟 3 个允许的字符,或 4 个零,或 4 个 Fs[\-]?
:0 或 1 个破折号((8|9|a|b)[a-f0-9]{3}|[0]{4}|[F]{4})
:4 后跟 3 个允许的字符,或 4 个零,或 4 个 Fs[\-]?
:0 或 1 个破折号[a-f0-9]{12}
:允许 12 个字符}?
:0 或 1 个右大括号对于任何正则表达式向导来说,如果可以执行以下操作,则可以进一步改进:
测试字符串是否匹配时,不要忘记模式中开头的 ^ 和结尾的 $。如果没有它们,您可以测试字符串是否包含请求的字符串,但不能测试它是否与请求的字符串匹配。 '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0- 9a-f]{12}$/'