PHP preg_match UUID v4

问题描述 投票:0回答:4

我有一个包含 UUID v4

的字符串
$uuid = 'http://domain.com/images/123/b85066fc-248f-4ea9-b13d-0858dbf4efc1_small.jpg';

我如何使用

b85066fc-248f-4ea9-b13d-0858dbf4efc1
从上面获得
preg_match()
值?
有关 UUID v4 的更多信息可以在此处

找到
php preg-match uuid
4个回答
22
投票
$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,但我不知道我们是否可以依赖它。


8
投票

您可以尝试这个简单的 uuid 模式

preg_match('/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/',$uuid,$matches);

0
投票

接受的答案有几个缺陷:

  • 它包含破坏正则表达式的隐藏字符
  • 它不允许使用大写字母(部分或全部)
  • 它不允许使用可选的破折号

有关 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
  • 它不允许使用包含前大括号和尾大括号的基于 Windows 的格式 (
    {...}
    )

也满足这些要求的正则表达式检查是:

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 个右大括号

对于任何正则表达式向导来说,如果可以执行以下操作,则可以进一步改进:

  • 要求如果存在一个破折号,则必须存在所有四个破折号
  • 仅当整个 UUID 全部为零或 F 时,才允许某些块中全部为零或全部 F
  • 仅允许左大括号或右大括号(如果两者都存在)

-3
投票

测试字符串是否匹配时,不要忘记模式中开头的 ^ 和结尾的 $。如果没有它们,您可以测试字符串是否包含请求的字符串,但不能测试它是否与请求的字符串匹配。 '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0- 9a-f]{12}$/'

© www.soinside.com 2019 - 2024. All rights reserved.