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

我正在根据 UUID ,我用它来识别用户发送的某种类型的数据; 并且想要验证客户端发送它的 UUID </ code>实际上是一个有效的版本4 UUID </ code>。</ p>

我发现这是 PHP preg_match UUID v4 ,它很接近但不完全是我正在寻找的东西。 我想知道是否存在与 is_empty()</ code>或 strtodate()</ code>类似的内容如果string无效,则发送 FALSE </ code>。</ p>

我可以根据正则表达式进行操作,但我想要更原生的东西来测试它。</ p>

任何想法?</ p>
</ div>

展开原文

原文

I'm making a validator based on UUID generated by client browser, I use this to identify a certain type data that the user sends; and would like to validate that the UUID that client sends it is in fact a valid Version 4 UUID.

I found this PHP preg_match UUID v4, it's close but not exactly what I'm looking for. I wish to know if exists something similar to is_empty() or strtodate() Where if string is not valid Sends FALSE.

I could do based on the regular expression but I would like something more native to test it.

Any ideas?

dongsuikai8286
dongsuikai8286 这个问题适用于PHP,但对于那些想要在Python中执行此操作的人来说,第二个答案是非常好的。
接近 5 年之前 回复

5个回答



版本4 UUID的格式为 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx </ code>,其中 x < / code>是任何十六进制数字, y </ code>是 8 </ code>, 9 </ code>, A </ code>或之一 。乙</代码> </ p>

 <代码> ^ [0-9A-F] {8}  -  [0-9A-F] {4} -4- [0-9A-F  ] {3}  -  [89AB] [0-9A-F] {3}  -  [0-9A-F] {12} $ 
</ code> </ pre>

允许小写 字母,使用 i </ code>修饰符→</ p>

  $ 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)或死('无效UUID');
</ code> </ pre>
</ div>

展开原文

原文

Version 4 UUIDs have the form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx where x is any hexadecimal digit and y is one of 8, 9, A, or B.

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

To allow lowercase letters, use i modifier →

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

duanlu1922
duanlu1922 v4 UUID的正确格式应包含破折号,因为它保留在答案中。 en.wikipedia.org/wiki/...
4 年多之前 回复
dongying9712
dongying9712 在执行正则表达式之前,我可能会添加一个简单的快速IF()来测试字符串的长度是32还是36个字符。 如果没有,它不是UUID十六进制字符串。
接近 7 年之前 回复

I found this question while I was looking for a Python answer. To help people in the same situation, I've added the Python solution.

You can use the uuid module:

#!/usr/bin/env python

from uuid import UUID


def is_valid_uuid(uuid_to_test, version=4):
    """
    Check if uuid_to_test is a valid UUID.

    Parameters
    ----------
    uuid_to_test : str
    version : {1, 2, 3, 4}

    Returns
    -------
    `True` if uuid_to_test is a valid UUID, otherwise `False`.

    Examples
    --------
    >>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
    True
    >>> is_valid_uuid('c9bf9e58')
    False
    """
    try:
        uuid_obj = UUID(uuid_to_test, version=version)
    except ValueError:
        return False

    return str(uuid_obj) == uuid_to_test


if __name__ == '__main__':
    import doctest
    doctest.testmod()
doukuang8166
doukuang8166 这不是挑剔,但非常好! 谢谢,@ kbuilds!
一年多之前 回复
dptk0969
dptk0969 超级挑剔,但你应该除了ValueError这里,以确保如果有人在try块中输入错误,这不会默默地破坏
一年多之前 回复
doujiaozhao2489
doujiaozhao2489 我其实并不太确定。 当我写这篇文章时,我认为这是必要的。 如果我正确地重新编号,它与UUID“修复”一些输入错误有关。 但我必须再次查看UUID代码。
接近 5 年之前 回复
dtk31564
dtk31564 我绝不会要求你删除它们 - 我的意图是提醒任何人使用它,没有那些,这是一个4班轮。 但是,虽然我们在这里 - 是否需要在最后一行进行比较?
接近 5 年之前 回复
duanla8800
duanla8800 别客气。 我非常喜欢这些评论,因为他们添加了额外的信息 - 就像你说的那样 - 如果你不需要它们可以被忽略:-)
接近 5 年之前 回复
dsaj20411
dsaj20411 并且,一旦删除了注释,比正则表达式更容易阅读和更好。 谢谢!
接近 5 年之前 回复
dsnw2651
dsnw2651 谢谢! 我没注意到,因为我是通过谷歌来回答这个问题的。 显然,我没有仔细阅读这个问题。 我仍然认为提出这个问题的人可能会对我的回答感兴趣。 我明确表示我的答案是Python解决方案。
接近 5 年之前 回复
douan8473
douan8473 应该清楚的是,你所展示的不是PHP,这就是这个问题所要求的。 因此,删除此代码并使其工作并不是一件容易的事情,因此需要谨慎使用PHP中的Python UUID模块。
接近 5 年之前 回复



  import re 

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

UUID_PATTERN。 match(uuid):
返回True
else:
返回False
</ code> </ pre>
</ div>

展开原文

原文

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

doumiang0597
doumiang0597 大笑我实际上没有注意到。
3 年多之前 回复
dongshadu4498
dongshadu4498 可能他不明白为什么你回答python代码时,问题是要求php
4 年多之前 回复
duanjue7745
duanjue7745 其实是的,只是返回比赛更好。 你有什么不明白的?
4 年多之前 回复
duanliu6083
duanliu6083 也许你可以解释一下? 顺便说一句:返回UUID_PATTERN.match(uuid)?
4 年多之前 回复



如果您只需要安全性(例如,如果您需要在javascript代码中打印它并且您想避免使用XSS) 破折号的位置并不重要,所以它只是:</ p>

  / ^ [a-z0-9 \  - ] {36} $ / i 
</ 代码> </ pre>

https://regex101.com/r/MDqB2Z / 1 </ p>
</ div>

展开原文

原文

If you only need it for security (for example if you need to print it in a javascript code and you want to avoid XSS) it doesn't really matter the position of the dashes, so it's just:

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

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

douyuan4357
douyuan4357 这不回答这个问题。
2 年多之前 回复

The existing answers all use regexIf you're using python, you might want to consider a try/except if you don't want to use regex: (Bit shorter than the answer above).

Our validator would then be:

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
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐