PHP Function to Auto Convert URL into Clickable Hyperlink (Anchor <a> Tag)

Posted in Web Development on 2 September 2009 19 comments

In wordpress, if you want to auto convert all URLs in your string into clickable hyperlinks, you can actually do it using the built-in function make_clickable().

Example of Usage

The email address and the 2 URLs will be transform into hyperlink (regardless of http:// prefix)

$string = 'I have some texts here and also links such as http://www.youtube.com , www.haha.com and lol@example.com. They are ready to be replaced.';

echo make_clickable($string);
Outside of WordPress?

make_clickable() is located in wp-includes/formatting.php

If you need to do that outside of wordpress, you can refer to the function’s source code at wp-includes/formatting.php

Here it is, a great function by WordPress :

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] . "$url" . $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] . "$dest" . $ret;
}

function _make_email_clickable_cb($matches) {
	$email = $matches[2] . '@' . $matches[3];
	return $matches[1] . "$email";
}

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("#(]+?>|>))]+?>([^>]+?)#i", "$1$3", $ret);
	$ret = trim($ret);
	return $ret;
}

 

Posted by Zen on 2 September 2009 19 comments
Tags :



or Subscribe to specific category only :




  - 19 Comments


Paul Dragoonis says:

Fantastic piece of code.
I tried loads of different code snippets and none of them were close to the perfectness of this code.

steve van assche says:

I agree with Paul,

This is the only perfect solution I could find on the web.

When an url already is an hyperlink, the code ignores it, really brilliant!

Thx!

Raja says:

Hi,

I also agree with Paul. it’s brilliant. I am new to PHP coding and also regular expression. I want to use the same code, but i want to add target to the tag. how can i do it?

Thnks..

D. Strout says:

@Raja – In the _make_url_clickable_cb, _make_web_ftp_clickable_cb, and _make_email_clickable_cb functions, just add your target attribute to the link tags. However, you must do it in this format:

$url

In other words, the quotes around your target attribute’s value must be preceded by a slash.

Raja says:

Hi,

i forgot to add that when i add target it work fine if we are converting the to url’s. if for example there is already a hyperlink present in the string like.. http://www.google.com. i want to add the target to this hyperlink. how to do it? like i said i am new to programming so please help me out

Thnks..

Kai says:

I tried to find the $string variable but couldn’t. As I’m a newbee to wordpress, I’d like to ask you:

* What php-file do I have to modify to make the automatic URL conversion work for all my posts? Thx.

Kevin says:

This is a fantastic set of functions for accomplishing this task. It was surprisingly difficult to find this.

The one flaw / pseud-bug I have noticed is when a URL is wrapped inside any type of parenthetical. For example:

(http://www.google.com)
[http://www.google.com]
{http://www.google.com}

…none of those will render using the above algorithm. It would be a great enhancement to fix that, but otherwise they seem flawless.

Luis Milanese says:

Wow, you just saved my ass! Thank you very much.

Nauris says:

Thanks. Best script that I found in web!

scvinodkumar says:

i tried your function its working fine… but when i have url within double quotes, it is not converting to url. For example,

$string = ‘I have some texts here and also links such as “http://www.youtube.com” , http://www.haha.com and lol@example.com. They are ready to be replaced.’;

when i call the functin, it is converting haha.com and lol@exmple.com only not youtube.com..

Please help me on this…

Yannick says:

Awesome code…

Chris says:

Excellent… one of those few snippets that are truly copy and paste. Well done!

Akos says:

This is the best PHP post I have ever seen. I really have to thank you for publishing this.

Stace Cameron says:

This code:

$string = ‘http://www.somesite.com‘;
echo “before\n”;
echo $string.”\n”;
echo “after\n”;
echo make_clickable($string);

Yields:

before

http://www.somesite.com

after

http://www.somesite.com

How would one modify the function to keep from adding the “http://” ?

Stace Cameron says:

Oops, the string is of the form

href=” url with http:// prefix” url without http:// prefix

It got rendered in my previous question.

Keri Jilson says:

You saved my morning! ILY!

erald says:

perfect for the tweeter feed i am working on.
thanks for sharing!

Aamir says:

It’s a really very informative information. It’s very useful and knowledgeable for me. I will bookmark this page and come soon to see the updates.

Leave a Reply

You must be logged in to post a comment.

Previous Post
«
Next Post
»