Создан файл со ссылками из ваших примеров:
$> cat ./text
<p><a href="http://example.com/fujipol/2004/may/5/16:10:47/400x345">foobar</a></p>
[Example markdown link](https://example.com)
<http://example.com/?foo=bar>
<a href="http://people.debian.org/~dilinger/backports/wordpress">http://people.debian.org/~dilinger/backports/wordpress</a>
"Greped" с некоторым регулярным выражением и получил все URL-адреса из него:
$> grep --only-matching --perl-regexp "http(s?):\/\/[^ \"\(\)\<\>]*" ./text
http://example.com/fujipol/2004/may/5/16:10:47/400x345
https://example.com
http://example.com/?foo=bar
http://people.debian.org/~dilinger/backports/wordpress
http://people.debian.org/~dilinger/backports/wordpress
Готово.
http(s?):\/\/[^ \"\(\)\<\>]*
То, что мы здесь сделали, соответствует http(s)
(URL может начинаться с http://
или https://
), чем мы сопоставили //
и избежали его.И, наконец, мы сопоставили последовательность символов, не равную
или "
или (
или )
или <
или >
.
Наконец, вся проблема в подобных задачах заключается в том, чтовыяснил, как мне решить, что раздел, который нам нужен, начинается (http(s)://
в этом случае) и заканчивается (
, "
, (
, )
, <
, >
).
Честно говоря, это решение на самом деле не идеально.Некоторые стандарты URL содержат гораздо больше информации о символах, которые URL может включать или не включать.Итак, сразу вы поймете, что использование регулярных выражений в моем ответе недопустимо.Но в случаях, которые вы описали, это работает, продают.