Я хочу:
Here is link: http://google.com And http://example.com inside. And another one at the very end: http://test.net
становиться:
Here is link: <a href="http://google.com">http://google.com</a> And <a href="http://example.com">http://example.com</a> inside. And another one at the very end: <a href="http://test.net">http://test.net</a>
Похоже на тривиальную задачу, но я не могу найти функцию PHP, которая работает. У тебя есть идеи?
function make_links_clickable($text){ // ??? } $text = 'Here is link: http://google.com And http://example.com inside. And another one at the very end: http://test.net'; echo make_links_clickable($text);
Используйте это (работает с ftp, http, ftps и https схемами):
function make_links_clickable($text){ return preg_replace('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '<a href="$1">$1</a>', $text); }
Попробуйте что-то вроде этого:
function make_links_clickable($text) { return preg_replace ('/http:\/\/[^\s]+/i', "<a href=\"${0}\">${0}</a>", $text); } $result = make_links_clickable($text);
вы должны обратиться к этому ответу. Заменить URL-адреса в тексте ссылками HTML.
Также, вдохновленный ответом Акаруна, следующая функция переключится на ссылки только на текст, который еще не является ссылкой. Добавленная функциональность проверяет, что ссылка с захваченной текстовой ссылкой еще не существует в целевой строке:
function make_links_from_http($content) { // Links out of text links preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', $content, $matches); foreach ($matches[0] as $key=>$link) { if (!preg_match('!<a(.*)'.$link.'(.*)/a>!i', $content)) { $content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content); } } return $content; }
При тестировании я заметил, что указанная выше функция не работает в строке # 5. Функция «messier», выполняющая задание, следующая:
function make_links_from_http($content) { // The link list $links = array(); // Links out of text links preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', $content, $matches); foreach ($matches[0] as $key=>$link) { $links[$link] = $link; } // Get existing preg_match_all('/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $content, $matches); foreach ($matches[2] as $key=>$value) { if (isset($links[$value])) { unset($links[$value]); } } // Replace in content foreach ($links as $key=>$link) { $content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content); } return $content; }
неfunction make_links_from_http($content) { // The link list $links = array(); // Links out of text links preg_match_all('!(((f|ht)tp(s)?://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', $content, $matches); foreach ($matches[0] as $key=>$link) { $links[$link] = $link; } // Get existing preg_match_all('/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $content, $matches); foreach ($matches[2] as $key=>$value) { if (isset($links[$value])) { unset($links[$value]); } } // Replace in content foreach ($links as $key=>$link) { $content = str_replace($link, '<a href="'.$link.'" target="_blank">'.$link.'</a>', $content); } return $content; }
Для нового кода я использовал учебное пособие по адресу: http://www.the-art-of-web.com/php/parse-links/
Вдохновленный ответом Акаруна, я придумал эту функцию для обработки всех протоколов и ссылок, которые начинаются только с www.
function make_links($text, $class='', $target='_blank'){ return preg_replace('!((http\:\/\/|ftp\:\/\/|https\:\/\/)|www\.)([-a-zA-Zа-яА-Я0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?!ism', '<a class="'.$class.'" href="//$3" target="'.$target.'">$1$3</a>', $text); }
Эта функция имеет необязательные параметры для добавления имен классов в ссылки, а также необязательную цель для ссылки, поэтому они открываются в новом окне / вкладке … по умолчанию параметр открывает ссылки на новое окно / вкладку, но если вы чувствуете, что не делаете что вы можете изменить значение по умолчанию или изменить значение при вызове функции.
function makeClickableLinks($text) { $text = html_entity_decode($text); $text = " ".$text; $text= preg_replace("/(^|[\n ])([\w]*?)([\w]*?:\/\/[\w]+[^ \,\"\n\r\t<]*)/is", "$1$2<a href=\"$3\" >$3</a>", $text); $text= preg_replace("/(^|[\n ])([\w]*?)((www|wap)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"http://$3\" >$3</a>", $text); $text= preg_replace("/(^|[\n ])([\w]*?)((ftp)\.[^ \,\"\t\n\r<]*)/is", "$1$2<a href=\"$4://$3\" >$3</a>", $text); $text= preg_replace("/(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"mailto:$2@$3\">$2@$3</a>", $text); $text= preg_replace("/(^|[\n ])(mailto:[a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+)+)/i", "$1<a href=\"$2@$3\">$2@$3</a>", $text); $text= preg_replace("/(^|[\n ])(skype:[^ \,\"\t\n\r<]*)/i", "$1<a href=\"$2\">$2</a>", $text); return $text; }
работать с:
wap.example.com
скайп: пример
почты: user@example.com
atherprotocol: //example.com