修改URL验证RegEx

时间:2017-10-12 13:58:03

标签: regex

$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>,它只允许使用每个特殊字符,所以我决定只允许使用字母数字和. , / & = ? : _ + # % -,因为它们在每个网址中使用。

1 个答案:

答案 0 :(得分:1)

只需将[^\s]替换为您想要的表达式[A-Za-z0-9.,/&=?:_+#%-]

实施例: https://regex101.com/r/kWB1q1/2