Php разбирает ссылки / электронные письма

Мне интересно, есть ли простой фрагмент, который преобразует ссылки любого вида:

<code>http://www.cnn.com to <a href="http://www.cnn.com">http://www.cnn.com</a>
cnn.com to <a href="http://www.cnn.com">cnn.com</a>
www.cnn.com to <a href="http://www.cnn.com">www.cnn.com</a>
[email protected] to  to <a href="mailto:mailto:[email protected]">mailto:[email protected]</a>
</code>

Я не хочу использовать какую-либо конкретную библиотеку PHP5.

Спасибо за ваше время.

UPDATE Я обновил приведенный выше текст, чтобы преобразовать его в. Обратите внимание, что тег href и текст отличаются для случаев 2 и 3.

UPDATE2 Как это делает чат в Gmail? Они довольно умные и работают только для реальных доменных имен. например a.ly работает, но a.cb не работает.

Ответы на вопрос(4)

Решение Вопроса

да ,http: //www.gidforums.com/t-1816.htm

<?php
/**
   NAME        : autolink()
   VERSION     : 1.0
   AUTHOR      : J de Silva
   DESCRIPTION : returns VOID; handles converting
                 URLs into clickable links off a string.
   TYPE        : functions
   ======================================*/

function autolink( &$text, $target='_blank', $nofollow=true )
{
  // grab anything that looks like a URL...
  $urls  =  _autolink_find_URLS( $text );
  if( !empty($urls) ) // i.e. there were some URLS found in the text
  {
    array_walk( $urls, '_autolink_create_html_tags', array('target'=>$target, 'nofollow'=>$nofollow) );
    $text  =  strtr( $text, $urls );
  }
}

function _autolink_find_URLS( $text )
{
  // build the patterns
  $scheme         =       '(http:\/\/|https:\/\/)';
  $www            =       'www\.';
  $ip             =       '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
  $subdomain      =       '[-a-z0-9_]+\.';
  $name           =       '[a-z][-a-z0-9]+\.';
  $tld            =       '[a-z]+(\.[a-z]{2,2})?';
  $the_rest       =       '\/?[a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1}';            
  $pattern        =       "$scheme?(?(1)($ip|($subdomain)?$name$tld)|($www$name$tld))$the_rest";

  $pattern        =       '/'.$pattern.'/is';
  $c              =       preg_match_all( $pattern, $text, $m );
  unset( $text, $scheme, $www, $ip, $subdomain, $name, $tld, $the_rest, $pattern );
  if( $c )
  {
    return( array_flip($m[0]) );
  }
  return( array() );
}

function _autolink_create_html_tags( &$value, $key, $other=null )
{
  $target = $nofollow = null;
  if( is_array($other) )
  {
    $target      =  ( $other['target']   ? " target=\"$other[target]\"" : null );
    // see: http://www.google.com/googleblog/2005/01/preventing-comment-spam.html
    $nofollow    =  ( $other['nofollow'] ? ' rel="nofollow"'            : null );     
  }
  $value = "<a href=\"$key\"$target$nofollow>$key</a>";
} 

?>
 Alec Smart24 июн. 2009 г., 17:01
Слишком хорошо работает. если я ввожу www.google.com, его ссылка остается как www.google.com вместо Google.com. Также не работает только google.com.
 Alec Smart24 июн. 2009 г., 17:04
Как это делает чат в Gmail?
 Travis24 июн. 2009 г., 17:17
Я думаю, что это делает то, что хочет аскер. Просто НЕ ТОЧНО отформатирован так, как он хочет. Возможно, ему придется немного изменить этот код.
 Alec Smart24 июн. 2009 г., 17:17
Я спрашиваю.
 Jrgns22 янв. 2011 г., 08:52
Чтобы сопоставить домены, такие как j.mp (еще один сокращенный URL-адрес), просто измените знак + в $ name на звездочку (*), т.е. $ name = '[a-z] [- a-z0-9] * \.';

Попробуй это. (по ссылкам не по электронной почте)

$newTweet = preg_replace('!http://([a-zA-Z0-9./-]+[a-zA-Z0-9/-])!i', '<a href="\\0" target="_blank">\\0</a>', $tweet->text);
 Leo17 февр. 2013 г., 21:01
Работал отлично для меня, хотя мне нужно было "?" Марк, чтобы работать также. Поэтому я использовал:code preg_replace ('! http: // ([a-zA-Z0-9./-] + ([? =.] [A-z0-9_] +) *)! i', '<a href = " \\ 0 "> \\ 0 </a> ', $ bla);
 Svetoslav Marinov31 авг. 2015 г., 15:45
там должно быть https?: // так что безопасные ссылки также совпадают

что на 5 лет позже, но мне нужно было подобное решение, и лучший ответ я получил от пользователя - Эрвана-dupeux-Майре

Отве

Я пишу эту функцию. Он заменяет все ссылки в строке. Ссылки могут быть в следующих форматах:

Www.example.comhttp: //example.cohttps: //example.co Example.fr

Второй аргумент является целью для ссылки («_blank», «_top» ... можно установить в false). Надеюсь, это поможет..

public static function makeLinks($str, $target='_blank')
{
    if ($target)
    {
        $target = ' target="'.$target.'"';
    }
    else
    {
        $target = '';
    }
    // find and replace link
    $str = preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="$1" '.$target.'>$1</a>', $str);
    // add "http://" if not set
    $str = preg_replace('/<a\s[^>]*href\s*=\s*"((?!https?:\/\/)[^"]*)"[^>]*>/i', '<a href="http://$1" '.$target.'>', $str);
    return $str;
}

Вот фрагмент электронной почты:

$email = "[email protected]";

$pos = strrpos($email, "@");
if (!$pos === false) {
    // This is an email address!
    $email .= "mailto:" . $email;
}

Что именно ты хочешь делать со ссылками? раздеть www или http? или добавитьhttp: // WWW на любую ссылку, если требуется?

 Alec Smart24 июн. 2009 г., 15:37
Я обновил вопрос.
 Alec Smart24 июн. 2009 г., 15:35
добавить WWW если нужно, добавьте к ним тег href

Ваш ответ на вопрос