PHP preg_match UUID v4

15

我有一个包含UUID v4的字符串

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

如何使用preg_match()从上面的内容中获取b85066fc-248f-4ea9-b13d-0858dbf4efc1的值?
有关UUID v4的更多信息可以在这里找到。


不确定,但尝试“^({{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}}{0,1})$” - Rufinus
Rufinus,这是错误的,请参见http://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29。 - Artefact2
3个回答

21
$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);

这也可以工作。引用自这里,但我不确定我们是否可以依赖它。


不,这个正则表达式太宽泛了。 - Artefact2
问题是如何从链接中获取 uuid,而不是从任何地方获取,例如不从文本中获取。UUID 的定义在这里,所以我想我的第二个解决方案,实际上是被窃取的,将适用于此目的。 - Nemoden
19
一个更严格的正则表达式是/[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}/ - Zoey Mertes
3
如果正则表达式看起来正确但不起作用:代码示例中有一些不可见字符显示在HTML源代码中:‌​没有代码高亮的工作版本:/[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}/ - stmllr
@ZachMertes RFC 还允许大写字母。 - Michael-O

8
你可以尝试使用这个简单的uuid模式。
preg_match('/\w{8}-\w{4}-\w{4}-\w{4}-\w{12}/',$uuid,$matches);

1
这是匹配 ________-____-____-____-____________ 的内容。 - Toto
1
是的,请不要使用这个。至少将 \w 替换为 [0-9a-f]:'/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/' - Kafoso

-2
当测试字符串是否匹配时,不要忘记在模式的开头加上^,在结尾加上$。没有它们,你可以测试字符串是否包含所请求的字符串,但不能测试字符串是否与所请求的字符串完全匹配。 '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/'

问题是要从字符串中提取UUID,使用^和$将UUID的模式放在字符串周围将不会匹配包含完整URL的字符串。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接