Php parse links / emails

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

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> abc@def.com to to <a href="mailto:mailto:abc@def.com">mailto:abc@def.com</a> 

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

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

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

UPDATE2 Hows делает gmail-чат? Они довольно умны и работают только для имен реальных доменов. egaly работает, но a.cb не работает.

Solutions Collecting From Web of "Php parse links / emails"

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

 <?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) ) // ie 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 = '[az][-a-z0-9]+\.'; $tld = '[az]+(\.[az]{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>"; } ?> 

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

 $newTweet = preg_replace('!http://([a-zA-Z0-9./-]+[a-zA-Z0-9/-])!i', '<a href="\\0" target="_blank">\\0</a>', $tweet->text); 

Я знаю, что прошло 5 лет, но мне было нужно аналогичное решение, и лучший ответ, который я получил, был от пользователя – erwan-dupeux-maire

Ответ

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

Второй аргумент – цель для ссылки ('_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 = "abc@def.com"; $pos = strrpos($email, "@"); if (!$pos === false) { // This is an email address! $email .= "mailto:" . $email; } по $email = "abc@def.com"; $pos = strrpos($email, "@"); if (!$pos === false) { // This is an email address! $email .= "mailto:" . $email; } 

Что именно вы собираетесь делать со ссылками? полоса www или http? или добавить http: // www по любой ссылке, если потребуется?