You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.1 KiB
67 lines
2.1 KiB
import ipaddress
|
|
import re
|
|
'''
|
|
正则管理类,用来实现对各类字符串进行合法性校验
|
|
'''
|
|
class ReManager():
|
|
def is_valid_ip(self,ip):
|
|
try:
|
|
ipaddress.ip_address(ip)
|
|
return True
|
|
except ValueError:
|
|
return False
|
|
|
|
def is_valid_subnet_mask(self,subnet_mask):
|
|
# 将子网掩码字符串转换为整数列表
|
|
bits = [int(b) for b in subnet_mask.split('.')]
|
|
if len(bits) != 4:
|
|
return False
|
|
|
|
# 检查每个部分是否在0-255范围内
|
|
if not all(0 <= b <= 255 for b in bits):
|
|
return False
|
|
|
|
# 检查子网掩码是否连续为1后跟连续为0
|
|
mask_int = (bits[0] << 24) + (bits[1] << 16) + (bits[2] << 8) + bits[3]
|
|
binary_mask = bin(mask_int)[2:].zfill(32)
|
|
ones_count = binary_mask.count('1')
|
|
if not all(bit == '1' for bit in binary_mask[:ones_count]) or not all(
|
|
bit == '0' for bit in binary_mask[ones_count:]):
|
|
return False
|
|
return True
|
|
|
|
def is_valid_port(self,port):
|
|
try:
|
|
port = int(port) # 尝试将端口转换为整数
|
|
if 1 <= port <= 65535: # 检查端口号是否在合法范围内
|
|
return True
|
|
else:
|
|
return False
|
|
except ValueError:
|
|
# 如果端口不是整数,返回False
|
|
return False
|
|
|
|
def is_valid_rtsp_url(self,url):
|
|
pattern = re.compile(
|
|
r'^(rtsp:\/\/)' # Start with rtsp://
|
|
r'(?P<host>(?:[a-zA-Z0-9_\-\.]+)|(?:\[[a-fA-F0-9:]+\]))' # Hostname or IPv4/IPv6 address
|
|
r'(?::(?P<port>\d+))?' # Optional port number
|
|
r'(?P<path>\/[a-zA-Z0-9_\-\.\/]*)?$' # Optional path
|
|
)
|
|
match = pattern.match(url)
|
|
return match is not None
|
|
|
|
mReM = ReManager()
|
|
|
|
if __name__ == "__main__":
|
|
urls = [
|
|
"rtsp://192.168.1.1:554/stream1",
|
|
"rtsp://example.com/stream",
|
|
"rtsp://[2001:db8::1]:554/stream",
|
|
"rtsp://localhost",
|
|
"http://example.com",
|
|
"ftp://example.com/stream"
|
|
]
|
|
|
|
for url in urls:
|
|
print(f"{url}: {mReM.is_valid_rtsp_url(url)}")
|