が欲しいです:
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 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;
}
と連携:
www.example.com
wap.example.com
ftp.example.com
スカイプ:例
mailto:[email protected]
atherprotocol://example.com
また、Akarunの回答に触発された次の関数は、まだリンクではないテキストのみをリンクに変換します。追加された機能は、キャプチャされたテキストリンクを持つリンクがターゲット文字列にまだ存在していないことを確認します。
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行目で失敗していることに気付きました。仕事をする「メッシャー」関数は次のとおりです。
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/
Akarunの回答に触発されて、www.
のみで始まるすべてのプロトコルとリンクを処理するtis関数を思いつきました
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);
}
この関数には、リンクにクラス名を追加するオプションのパラメーターと、リンクのオプションのターゲットがあり、新しいウィンドウ/タブで開きます...デフォルトでは、パラメーターは新しいウィンドウ/タブへのリンクを開きますが、実行したくない場合はつまり、デフォルトを変更したり、関数を呼び出すときに値を変更したりできます。