m{ (?:ldap|http)s?:// # Scheme
(?:(?!.*\d[/?:]) [a-z0-9\-._~%]+ | # IPv4 host (forbid ending with digit)
# IP (yep, I've copied this regexp)
(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])
\[[a-z0-9\-._~%!$&'()*+,;=:]+\] ) # or IPv6 host
(?::\d+)? # Port
(?:
[/?] # Slash or question mark
[-A-Z0-9+&@#/%?=~_|$!:,.;]* # URL itself
)? # Technically, trailing / is required in URLs, but many browser implementations ignore it when accepting those
}ix
Это регулярное выражение должно работать с /ix
.Поскольку JS не включает модификатор /x
, я собираюсь включить версию без него.
/(?:ldap|http)s?:\/\/(?:(?!.*\d[\/?:])[a-z0-9\-._~%]+|(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\[[a-z0-9\-._~%!$&'()*+,;=:]+\])(?::\d+)?(?:[\/?][\-A-Z0-9+&@#\/%?=~_|$!:,.;]*)?/i
Обратите внимание, что в URL-адресах HTTP допускается много символов без экранирования с помощью знака %
.Вы, вероятно, не хотели бы, чтобы URL не передавался только потому, что он содержит разрешенный в URL-адресе символ *
:).