클라이언트 브라우저에 의해 생성된 UUID를 기반으로 검증자를 만들고 있습니다.이 검증자는 사용자가 전송하는 특정 유형의 데이터를 식별하기 위해 사용합니다.또, 이 검증은,UUID
클라이언트가 송신하는 것은, 실제로는 유효한 버전4 입니다. UUID
.
이 PHP preg_match UUID v4를 찾았습니다.근접하지만 제가 찾던 것은 아닙니다.같은 것이 존재하는지 알고 싶습니다.is_empty()
또는strtodate()
문자열이 올바르지 않은 경우 보내기FALSE
.
정규 표현으로 할 수 있지만, 좀 더 원어민적인 것을 시험해 보고 싶습니다.
좋은 생각 있어요?
2019년 11월 23일 편집: 중복 태그에 대해, 주최자가 기술적으로 옳지만, 이 질문은 존재하는 경우 다른 것을 fibd하여 정규화하는 것을 목표로 작성되었으며, 두 번째로 이 질문은 Pythoner와 PHPer에 대한 참조가 되어 문제를 해결하기 위한 다른 답변/접근법을 가지고 있으며, 그 답변이 더 잘 설명되어 있습니다.d일반적으로이것이 내가 이 질문을 존중해야 한다고 생각하는 이유이다.
질문에 대한 답변
버전 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 솔루션을 추가했습니다.
모듈을 사용할 수 있습니다.
#!/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 __name__ == '__main__':
import doctest
doctest.testmod()
기존 응답은 모두 regex를 사용합니다.Python을 사용하는 경우,try/except
regex 를 사용하지 않는 경우: (위의 답변보다 짧은 비트)
검증자는 다음과 같습니다.
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 >>> is_valid_uuid("{20f5484b-88ae-49b0-8af0-3a389b4917dd}") True >>> is_valid_uuid("20f5484b88ae49b08af03a389b4917dd") True
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-f0-9-]{36}$/i
https://regex101.com/r/MDqB2Z/11
(v4에 특유한 것은 아니지만, 일반적으로 올바르게 작성된 어플리케이션에서는 대시 드롭 후 BINARY(16)로 저장되므로 문제가 발생해도 오브젝트를 찾지 못하고 404를 던지기만 하면 과잉 검증이 필요하지 않을 수 있습니다).