php uuid 是否重复,php-如何确定一个字符串是否是有效的v4 UUID?

php-如何确定一个字符串是否是有效的v4 UUID?

我正在根据客户端浏览器生成的UUID进行验证,我用它来识别用户发送的某种类型的数据。 并希望验证客户端发送的is_empty()实际上是有效的版本4 strtodate()。

我找到了这个PHP preg_match UUID v4,它已经很接近了,但并不是我想要的。 我想知道是否存在类似于is_empty()或strtodate()的地方,如果字符串无效,则发送FALSE。

我可以根据正则表达式进行操作,但是我想尝试一些更原生的方法。

有任何想法吗?

Rafael asked 2020-02-05T16:10:37Z

5个解决方案

81 votes

版本4 UUID的格式为i,其中x是任何十六进制数字,而y是8、9、A或A中的一种。

^[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');

Ωmega answered 2020-02-05T16:11:02Z

36 votes

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

您可以使用uuid模块:

#!/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()

Martin Thoma answered 2020-02-05T16:11:26Z

4 votes

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

Andrey Shipilov answered 2020-02-05T16:11:42Z

4 votes

现有的答案都使用正则表达式如果您使用的是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

slajma answered 2020-02-05T16:12:07Z

3 votes

如果您仅出于安全考虑而需要它(例如,如果您需要使用javascript代码打印它,并且希望避免使用XSS),则破折号的位置实际上并不重要,因此只是:

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

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

the_nuts answered 2020-02-05T16:12:32Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值