Ich mache einen Validierer basierend auf UUID , der vom Client-Browser generiert wurde. Ich benutze dies, um einen bestimmten Typ zu identifizieren, den der Benutzer sendet. und möchte bestätigen, dass die UUID
, die der Client sendet, tatsächlich eine gültige Version 4UUID
ist.
Ich habe diese PHP preg_match UUID v4 gefunden, es ist nah, aber nicht genau das, wonach ich suche. Ich möchte wissen, ob etwas Ähnliches wie is_empty()
oder strtodate()
existiert. Wenn der String nicht gültig ist, wird FALSE
gesendet.
Ich könnte dies auf der Basis des regulären Ausdrucks tun, aber ich hätte gerne etwas mehr Muttersprache, um es zu testen.
Irgendwelche Ideen?
UUIDs der Version 4 haben die Form xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
, wobei x
eine beliebige hexadezimale Ziffer ist und y
eine von 8
, 9
, A
oder B
ist.
^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$
Um Kleinbuchstaben zuzulassen, verwenden Sie den Modifizierer 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');
Ich habe diese Frage gefunden, als ich nach einer Python-Antwort suchte. Um Menschen in derselben Situation zu helfen, habe ich die Lösung Python hinzugefügt.
Sie können das Modul uuid
verwenden:
#!/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 __== '__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
Wenn Sie es nur aus Sicherheitsgründen benötigen (wenn Sie es beispielsweise in einem JavaScript-Code drucken müssen und XSS vermeiden möchten), spielt es keine Rolle, an welcher Position die Striche stehen.
/^[a-z0-9\-]{36}$/i
Alle vorhandenen Antworten verwenden regex. Wenn Sie Python verwenden, sollten Sie einen try/except
in Betracht ziehen, wenn Sie regex nicht verwenden möchten: (etwas kürzer als die Antwort oben).
Unser Validator wäre dann:
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