如何确定字符串是否是有效的v4 UUID?

时间:2013-11-14 22:10:42

标签: php jquery html regex uuid

我正在根据客户端浏览器生成的UUID制作验证器,我用它来识别用户发送的某种类型的数据;并且想验证客户端发送它的UUID实际上是有效的Version 4 UUID

我发现了这个PHP preg_match UUID v4,它很接近,但并不完全是我正在寻找的东西。我想知道是否存在类似于is_empty()strtodate()的内容,如果字符串无效,则发送FALSE

我可以根据正则表达式做,但我想要更原生的东西来测试它。

有什么想法吗?

5 个答案:

答案 0 :(得分:76)

版本4 UUID的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中x为十六进制数字,y89A之一,或B

^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$

要允许使用小写字母,请使用i修饰符→

$UUIDv4 = '/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i';
preg_match($UUIDv4, $value) or die('Not valid UUID');

答案 1 :(得分:30)

我在寻找Python答案时发现了这个问题。为了帮助处于相同情况的人们,我添加了 Python 解决方案。

您可以使用uuid模块:

%: $(OBJS)
    @echo making $@
    ...

答案 2 :(得分:4)

import re

UUID_PATTERN = re.compile(r'^[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}$', re.IGNORECASE)
uuid = '20f5484b-88ae-49b0-8af0-3a389b4917dd'

if UUID_PATTERN.match(uuid):
    return True
else:
    return False

答案 3 :(得分:3)

如果你只是为了安全而需要它(例如,如果你需要在javascript代码中打印它并且你想避免使用XSS)那么破折号的位置并不重要,所以它只是:

 /^[a-z0-9\-]{36}$/i

https://regex101.com/r/MDqB2Z/1

答案 4 :(得分:1)

现有答案都使用正则表达式如果您使用的是python,则如果不想使用正则表达式,可能要考虑使用try/except(比上面的答案短一点)。

我们的验证者将是:

import uuid

def is_valid_uuid(val):
    try:
        uuid.UUID(str(val))
        return True
    except ValueError:
        return False

>>> is_valid_uuid(1)
False
>>> is_valid_uuid("123-UUID-wannabe")
False
>>> is_valid_uuid({"A":"b"})
False
>>> is_valid_uuid([1, 2, 3])
False
>>> is_valid_uuid(uuid.uuid4())
True
>>> is_valid_uuid(str(uuid.uuid4()))
True
>>> is_valid_uuid(uuid.uuid4().hex)
True
>>> is_valid_uuid(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid(uuid.uuid5(uuid.NAMESPACE_DNS, 'example.net'))
True