Как определить, является ли строка допустимым идентификатором UUID v4?
Я создаю валидатор на основе UUID, сгенерированного браузером клиента, я использую его для идентификации данных определенного типа, которые отправляет пользователь; и хотел бы проверить, что UUID
, который отправляет клиент, на самом деле является действительной версией 4 UUID
.
Я нашел это PHP preg_match UUID v4, это близко, но не совсем то, что я ищу. я хочу знать, существует ли что-то похожее на is_empty()
или strtodate()
, где, если строка недопустима, отправляет FALSE
.
Я мог бы сделать основано на регулярном выражении, но я хотел бы что-то более родное, чтобы протестировать его.
Есть идеи?
4 answers
UUID версии 4 имеют вид xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
, где x
- любая шестнадцатеричная цифра, а y
- одна из 8
, 9
, A
, или 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');
Я нашел этот вопрос, когда искал ответ на 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:
return False
return str(uuid_obj) == uuid_to_test
if __name__ == '__main__':
import doctest
doctest.testmod()
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
Если вам это нужно только для безопасности (например, если вам нужно распечатать его в коде javascript и вы хотите избежать XSS), на самом деле не имеет значения положение тире, поэтому просто:
/^[a-z0-9\-]{36}$/i