2010-05-16 1 views
2

Я хочу иметь функцию, которая получает текст как ввод и возвращает текст с URL-адресами, сделанными в HTML-ссылки в качестве вывода.PHP: обнаружение URL-адресов (regexp) включает в себя разрывы строк

Мой проект заключается в следующем:

function autoLink($text) { 
    return preg_replace('/https?:\/\/[\S]+/i', '<a href="\0">\0</a>', $text); 
} 

Но это не работает должным образом.

Для ввода текста, который содержит ...

http://www.google.de/ 

... Я получаю следующий вывод:

<a href="http://www.google.de/<br">http://www.google.de/<br</a> /> 

Почему включать разрывы строк? Как я могу ограничить его подлинным URL?

Заранее благодарен!

ответ

4

Ну, < не является символом пробела, поэтому it is matched by [\S]. Вы можете исключить его из набора принятых символов:

preg_replace('/https?:\/\/[^\s<]+/i', '<a href="\0">\0</a>', $text); 
+0

Спасибо, это прекрасно работает для данной проблемы. Но было бы идеально, если бы другие символы, такие как «и», также были бы исключены. Должен ли я записать их в первый []? – caw

+1

@ marco92w: Точно. Все внутри '[^ ...]' будет исключено. – Heinzi

1

Как насчет использования Gruber's URL Regex?

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))) 
+0

Спасибо, интересная страница. Но для моей цели достаточно регулярного выражения. Каковы преимущества вашего регулярного выражения? – caw

+1

@ marco92w: Регулярное выражение не мое. Это от того же парня, который «придумал» уценку. Например, ваше регулярное выражение не будет autolink 'ftp [s]: //' или 'www. *' (нет протокола). Прочтите это и протестируйте его: http://daringfireball.net/2009/11/liberal_regex_for_matching_urls –

+1

Большое спасибо, сейчас Я понимаю все преимущества. – caw

Смежные вопросы