Я делаю валидатор на основе UUID, созданного браузером клиента, я использую его для идентификации данных определенного типа, которые отправляет пользователь; и хотел бы подтвердить, что UUID
который его отправляет клиенту, фактически является допустимым UUID
версии 4 .
Я нашел этот PHP preg_match UUID v4 , он близок, но не совсем то, что я ищу. Я хочу знать, существует ли что-то похожее на is_empty()
или strtodate()
Если строка недействительна, отправляет FALSE
.
я мог бы сделать, основываясь на регулярном выражении, но мне хотелось бы, чтобы что-то более родное, чтобы проверить его.
Есть идеи?
Версии 4 UUID имеют форму 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');
,$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