$regex = "_^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:/[^\s]*)?$_iuS";
我在哪里添加了我的表达式[A-Za-z0-9.,/&=?:_+#%-]
,只允许使用这些特定字符,同时保留在$regex
中创建的网址格式,
我尝试在_^
之后的开头添加它,但它发现每个网址都是无效的网址,即从表达式中移除_
后也是如此。
$regex
可以正常工作,可以防止像www..doma@$#n.#@om
这样奇怪的网址,但是当它涉及到之后的部分时
www.domain.com/<script>alert('Hacked')</script>
,它只允许使用每个特殊字符,所以我决定只允许使用字母数字和. , / & = ? : _ + # % -
,因为它们在每个网址中使用。