2013-11-14 2 views
22

Я делаю валидатор на основе UUID, сгенерированный браузером клиента, я использую его для идентификации данных определенного типа, которые отправляет пользователь; и хотел бы подтвердить, что UUID, который клиент отправляет, фактически является действительным Version 4UUID.Как определить, является ли строка допустимым UUID v4?

Я нашел это PHP preg_match UUID v4, это близко, но не совсем то, что я ищу. Я хочу знать, существует ли что-то похожее на is_empty() или strtodate() Если строка недействительна, отправляется FALSE.

Я мог бы сделать, основываясь на регулярном выражении, но мне хотелось бы что-то более родное, чтобы проверить его.

Любые идеи?

+1

в Ques для PHP, но для тех из вас, кто хочет это сделать в Python, второй ответ ниже очень хорош. – jsbueno

ответ

38

Version 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'); 
+2

Перед выполнением регулярного выражения я мог бы добавить быстрый простой 'IF()' для проверки длины 32 или 36 символов. Если нет, это не шестнадцатеричная строка UUID. –

+1

@xrDDDD ваше регулярное выражение не работает, а Ωmega. Это с uuid-v4, созданным postgres. – Jehan

+0

Правильный формат v4 UUID ** должен содержать тире **, поскольку он остается в ответе. https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 –

16

Я нашел этот вопрос, пока я искал ответ на 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() 
+2

Должно быть ясно, что вы показываете не PHP, о чем спрашивает этот вопрос. Таким образом, не совсем тривиально отказаться от этого кода и заставить его работать, потребуется некоторое время, чтобы использовать модуль UUID Python из PHP. – Garbee

+1

@Garbee Спасибо! Я этого не заметил, потому что я пришел к этому вопросу через Google. Очевидно, я не внимательно изучил вопрос. Я все еще думаю, что люди, которые приходят на этот вопрос, могут быть заинтересованы в моем ответе. Я дал понять, что мой ответ - это решение Python. –

+0

И, как только комментарии удаляются, на порядок более читабельны и приятны, чем регулярные выражения. Благодаря! – jsbueno

3
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 
+1

Возможно, вы могли бы немного объяснить? Кстати: 'return UUID_PATTERN.match (uuid)'? –

+0

На самом деле да, просто верни матч лучше. Что вы не понимаете здесь? –

+1

@ AndreyShipilov, вероятно, он не понимает, почему вы ответили на код python, когда вопрос задает php –

3

Если вам нужно только для обеспечения безопасности (например, если вам нужно распечатать его в яваскрипте кода, и вы хотите, чтобы избежать XSS) это Безразлично «т действительно имеет значение положения штрихов, так это просто:

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

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

Смежные вопросы