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().
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);
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;
}
Fantastic piece of code.
I tried loads of different code snippets and none of them were close to the perfectness of this code.
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!
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..
@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.
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..
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.
Found a plugin that does the job:
http://www.semiologic.com/software/autolink-uri/
cheers
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.
Wow, you just saved my ass! Thank you very much.
Thanks. Best script that I found in web!
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…
Awesome code…
Excellent… one of those few snippets that are truly copy and paste. Well done!
This is the best PHP post I have ever seen. I really have to thank you for publishing this.
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://” ?
Oops, the string is of the form
href=” url with http:// prefix” url without http:// prefix
It got rendered in my previous question.
You saved my morning! ILY!
perfect for the tweeter feed i am working on.
thanks for sharing!
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.