[〜#〜] uuid [〜#〜] に基づいてバリデーターを作成しています。これは、ユーザーが送信する特定のタイプのデータを識別するために使用します。クライアントが送信するUUID
が実際に有効な バージョン4UUID
であることを検証したいと考えています。
私はこれを見つけました PHP preg_match UUID v4 、それは近いですが、私が探しているものとはまったく異なります。 is_empty()
またはstrtodate()
に似たものが存在するかどうかを知りたい場合、文字列が有効でない場合はFALSE
を送信します。
正規表現に基づいて行うこともできますが、よりネイティブなものをテストしたいと思います。
何か案は?
バージョン4 UUIDの形式はxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
ここで、x
は任意の16進数で、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 ValueError:
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
既存の回答はすべてregexを使用しています。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
セキュリティのためだけに必要な場合(たとえば、JavaScriptコードで印刷する必要があり、XSSを避けたい場合)、実際にはダッシュの位置は重要ではないため、次のようになります。
/^[a-z0-9\-]{36}$/i