[-A-Z0-9+&@#\/%?=~_|!:,.;]*
, кажется, отбивает большую часть URL, поэтому нам нужно где-то здесь зажать .gov и .edu. Самое быстрое решение будет:
[-A-Z0-9+&@#\/%?=~_|!:,.;]+(\.gov|\.edu)[-A-Z0-9+&@#\/%?=~_|!:,.;]*
Однако, это будет соответствовать URL-адресу, как: http://www.example.com/evil.gov/test.html
Чтобы исправить это, мы можем извлечь /
, который ему соответствует, перед доменом верхнего уровня:
[-A-Z0-9+&@#%?=~_|!:,.;]+(\.gov|\.edu)[-A-Z0-9+&@#\/%?=~_|!:,.;]*
Или, в заключение, мы имеем:
/(\b(https?|ftp):\/\/[-A-Z0-9+&@#%?=~_|!:,.;]+(\.gov|\.edu)[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|]?)/
Из-за проблемы, которая не соответствует example.gov, я добавил ?
к последнему токену.
Черт, это безобразно.