www.google.com
Это не URL, это имя хоста. Как правило, не стоит начинать разметку пустых имен хостов в произвольном тексте, поскольку в общем случае любое слово или последовательность слов, разделенных точками, является совершенно допустимым именем хоста. Это означает, что вы столкнулись с ужасными взломами, такими как поиск ведущих www.
(и у вас возникнут вопросы типа «почему я могу ссылаться на www.stackoverflow.com
, но не stackoverflow.com
?») Или конечные TLD (что становится все более и более непрактичным по вводится больше новых TLD: «почему я могу любить ncm.com, но не ncm.museum
?»), и вы будете часто отмечать вещи, которые не должны быть ссылками.
Я мог бы попытаться написать какое-нибудь действительно необычное регулярное выражение
Ну, я не понимаю, как бы вы это сделали без регулярное выражение.
Трюк справляется с разметкой. Если на входе могут быть символы <
, &
и "
, вы не должны допускать их к выводу HTML. Если вы вводите простой текст, вы можете сделать это, позвонив по номеру htmlspecialchars()
, прежде чем применить простую замену к шаблону, подобному тому, что был в ответе Нико.
(Если входные данные уже содержат разметку, у вас есть проблемы, и вам, вероятно, потребуется анализатор HTML, чтобы определить, какие биты являются разметкой, чтобы избежать добавления дополнительной разметки внутри. Аналогично, если вы выполняете дополнительную обработку после этого вставляя больше тегов, эти шаги могут иметь ту же трудность. В языках, подобных bbcode, это часто приводит к ошибкам и проблемам безопасности.)
Другая проблема - конечная пунктуация. Обычно люди ставят после ссылки точку, запятую, закрывающую скобку, восклицательный знак и т. Д., Которые не должны быть частью ссылки, но на самом деле являются действительными символами. Это полезно, чтобы удалить их и не помещать их в ссылку. Но затем вы разрываете ссылки на вики, оканчивающиеся на )
, поэтому, возможно, вы не захотите трактовать )
как завершающий символ, если в ссылке есть (
, или что-то в этом роде. Такого рода вещи нельзя сделать с помощью простой замены регулярных выражений, но вы можете сделать это с помощью функции обратного вызова замены.