Transform Text URLs to hyperlinks in PHP

Discussion in 'PHP' started by arbet, Sep 4, 2009.

  1. #1
    Hello,

    I have some text which contains some links, and I have to transform it into hyperlinks using PHP.

    I have searched on the net and wasn't able to find anything meaningful. Is there any library or class which does this?
     
    arbet, Sep 4, 2009 IP
  2. ads2help

    ads2help Peon

    Messages:
    2,142
    Likes Received:
    67
    Best Answers:
    1
    Trophy Points:
    0
    #2
    This will help.

    Actually I just googled using your keyword : "php url to hyperlink"
     
    ads2help, Sep 4, 2009 IP
  3. arbet

    arbet Peon

    Messages:
    41
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #3
    I tried this but for some reason it wasn't parsing the URLs correctly, it was just linking http:// only I believe.
     
    arbet, Sep 4, 2009 IP
  4. yuvrajm

    yuvrajm Peon

    Messages:
    52
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #4
    
    $text = ; // place here whatever you want to replace
    preg_replace('/'.$text.'/', '<a href="'.$text.'">'.$text.'</a>', $string);
    
    Code (markup):
    if this gives some trouble then simply place a backslash before the $text in preg function
     
    yuvrajm, Sep 4, 2009 IP
  5. arbet

    arbet Peon

    Messages:
    41
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #5
    Thanks, but this does not work, as the text I don't need to hyperlink the whole text, just the part of the text which are URLs.
     
    arbet, Sep 5, 2009 IP
  6. ads2help

    ads2help Peon

    Messages:
    2,142
    Likes Received:
    67
    Best Answers:
    1
    Trophy Points:
    0
    #6
    So I found a very nice function in wordpress.

    <?php
    
    function _make_url_clickable_cb($matches) {
    	$ret = '';
    	$url = $matches[2];
    
    	if ( empty($url) )
    		return $matches[0];
    	// removed trailing [.,;:] from URL
    	if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {
    		$ret = substr($url, -1);
    		$url = substr($url, 0, strlen($url)-1);
    	}
    	return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;
    }
    
    function _make_web_ftp_clickable_cb($matches) {
    	$ret = '';
    	$dest = $matches[2];
    	$dest = 'http://' . $dest;
    
    	if ( empty($dest) )
    		return $matches[0];
    	// removed trailing [,;:] from URL
    	if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {
    		$ret = substr($dest, -1);
    		$dest = substr($dest, 0, strlen($dest)-1);
    	}
    	return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;
    }
    
    function _make_email_clickable_cb($matches) {
    	$email = $matches[2] . '@' . $matches[3];
    	return $matches[1] . "<a href=\"mailto:$email\">$email</a>";
    }
    
    function make_clickable($ret) {
    	$ret = ' ' . $ret;
    	// in testing, using arrays here was found to be faster
    	$ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_url_clickable_cb', $ret);
    	$ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);
    	$ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);
    
    	// this one is not in an array because we need it to run last, for cleanup of accidental links within links
    	$ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
    	$ret = trim($ret);
    	return $ret;
    }
    
    $str = 'some string here and http://www.haha.com/ and www.youtube.com';
    
    echo make_clickable($str);
    
    ?>
    PHP:
    It replaces http://www.haha.com/ , www.youtube.com and email address too.
     
    Last edited: Sep 5, 2009
    ads2help, Sep 5, 2009 IP
  7. arbet

    arbet Peon

    Messages:
    41
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #7
    Works like a charm! Thanks :D

    Demo: http://www.courtixhosting.com/ - Check the twitter feed on the right, the links were not clickable before.
     
    arbet, Sep 5, 2009 IP