<?php
// The Regular Expression filter
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
// The Text you want to filter for urls
$text = "The text you want to filter goes here. http://google.com";
// Check if there is a url in the text
if(preg_match($reg_exUrl, $text, $url)) {
// make the urls hyper links
echo preg_replace($reg_exUrl, "<a href="{$url[0]}">{$url[0]}</a> ", $text);
} else {
// if no urls in the text just return the text
echo $text;
}
?>
The basic function of this is to find any URLs in the block of text and turn them into hyperlinks. It will only find URLs if they are properly formatted, meaning they have a http, https, ftp or ftps.
Check out the comments below for more solutions.
I want to thank you from the bottom of my little heart, I have been in search for this exact script for the past 6 months! Thank you, thank you, thank you. I would like to point out however that there was error but nothing I could not fix :D Assid from your code this is the code that I got to work for myself.
Again thank you very much!
great!!! ela
Thank you very much for fixing the code
Thanks again. CODE works well.
Hi All, Good one finding URL in text and making it as link. I have one doubt. Lets assume i have some text which contain plain URL and image tag with src(“https://www.something.com/images/test/jpeg”). So i need to skip img tag and only hyperlink URL. How is this possible?
Thanks You Gentleman
How can i filter replace string for avoid image file links in text?
som text with link https://hola.com and with image
I want only replace link to web, and not replace link to image.
it could not work two urls in the text.
This doesn’t work for 2 or more URLs.
Try using a loop => solved my problem when getting the data via MySQL
Add “g” to the end of the regexp to catch all instances.
Find the Image URL using preg_match() syntax or something similar to extract JPG or PNG or GIF URLs from a mixed text and put them in an array or at last store the first url.
maybe some syntax which searchs for strings that are beginning with http and ending with jpg/png/gif..
i believe it can be done with preg_match()
Note: the text can be like that : $string =blablablabla”http://www.xxx.com/xxx.jpg”blablablabla
$matches = array();
preg_match_all(‘!http://.+\.(?:jpe?g|png|gif)!Ui’ , $string , $matches);
Thanks,
It works like charm!
This is probably what most people are looking for. Thanks for taking the initiative to improve it.
This is my version based on previous examples… hope this helps someone trying to force links on www without the http…
simply call the function as follows:
$body = txt2link($body);
When using the above codes inside a loop (wherein bulleted lists are created that have text/links in them) I get a server error if there’s more than one list item with a url that needs to be converted. Any way to do this in a foreach?
Thanks!
Cases that this won’t catch:
http://localhost/test
http://1.2.3.4/test
Also if you feed in
“http://www.google.co.uk/page is on the website http://www.google.co.uk/”
you will get some very mangled output, as when you search for “http://www.google.co.uk/” you will also match the text in the middle of the existing link for “http://www.google.co.uk/page”
your site is amazing. no bull shit. all good stuff. pls include my email id in ur permanent mailing list.
can that original script for finding urls be modifed to look for links ending with an .mp3 exstension?
Thanks, working a charm!
Great post. Just what I was looking for. I’m going to use it on my site.
Thanks.
Another equivalent function that make better results : http://code.seebz.net/p/autolink-php/
There is the same in javascript : http://code.seebz.net/p/autolink-js/
Awesome man! thanks for this beauty
The domain name can be longer then 3 characters, e.g. http://cxid.info/
Great trick for developing the regular expression.
I’ve changed it a little bit, cause it won’t work for more than one url. Besides THANK YOU very much for the help.
i really liked this preg :D
is there a demo of this? i’ve been trying to put a url in a class on a div that will make the text in the div a link WIthout having to use the in the html markup. Is this overkill on unobtrusive css?
Hi guys
This way is much easier. The cost converts URLs in $Text to html hyper links:
if (preg_match(“/http/”, “$Text”) OR preg_match(“/www/”, “$Text”))
{
$ExplodeText = explode(” “, $Text);
foreach($ExplodeText as $Check)
{if (preg_match(“/http/”, “$Check”) OR preg_match(“/www/”, “$Check”)) {$Text = str_replace($Check , “$Check” , $Text);}}
}
Apologies, there was a mistake in the code I post above. Below is the corrected version:
if (preg_match(“/http/”, “$Text”) OR preg_match(“/www/”, “$Text”))
{
$Text = str_replace(” www” , ” http://www” , $Text);
$Explode = explode(” “, $Text);
foreach($Explode as $Check) {if (preg_match(“/http/”, “$Check”) OR preg_match(“/www/”, “$Check”)) {$Text = str_replace($Check , “$Check” , $Text);}}
}
please list my email id in your mailing lists i would like to be notified about all the stuffs discussed here thanks!
Great regex, thankyou! Here’s a single preg_replace that doesn’t need a loop and catches both http:// or www.
$text = “check out my link http://mylink.com or http://www.otherlink.com works too”;
$reg_exUrl = “/((((http|https|ftp|ftps)\:\/\/)|www\.)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/\S*)?)/”;
echo preg_replace( $reg_exUrl, “<a href=\"$1\">$1</a> “, $text );
Addendum: actually, it treats www. links as local links, so further work needs to be done on that.
Hi, If the url has ‘%20’ how can I make it?
Example: http://www.lalala.com/%20text%20some.html
Can you help me?
Thank you
Regards
replace the %20 beforehand
Thanks for this tutorial. I happy. It work… :)
Can some on post or email me the COMPLETE SCRIPT FINALLY WHICH CAN FIND ALL URLS IN A PAGE AND HIGHLIGHT THEM AS LINKS
I am requesting as i do not know coding for my self as i am not into web-designing
This is great article but it can’t handle certain situation so i modified it bit so check the article below that works great with possible all situation…
http://www.javaquery.com/2012/06/turn-urls-into-links-in-text-with.html
actualy everything is much easier)
*
much easier than write a comment with code on this site XD
****, kk there should be “href=”\”>\” in the ancor tag
grrrrrrrrrrrrrrrrrrrr THIS IS THE LINK 4 SOLUTION
Yep. It’s much easier… lol
Tks for your persistence. Your code worked…
I have a chat log i want to get all links out of. How do i use this code to do this?
*I am not a programmer*
can i run some kind of batch command file or something and point to the text log?
echo preg_replace($reg_exUrl, “{$url[0]} “, $text);
In above code
“{$url[0]}” => ‘{$url[0]}’
fix my problem
I keep having error on this line
echo preg_replace($reg_exUrl, “{$url[0]} “, $text);
I think it has to be from “{$url[0]}” and {$url[0]}
can anyone help me on whats going on
Yep, you should change it to
echo preg_replace($reg_exUrl, “.$url[0].“, $text);
i made some changes on it to work with multiple links
This worked for me, but won’t work without http:// or https://, how would I add so it would work with www?
Hello to every single one, it’s really a fastidious for me to visit this web site, it contains useful Information.
Yep!! Another very usefull snippet!! Another bookmark to css ticks ;)
It has syntax errors too.Below is the correct code:
//easy—>worked for me
$data =”my text http://www.facebook.com/c.hodari90“;
$data = preg_replace( ‘/(http|ftp)+(s)?:(\/\/)((\w|.)+)(\/)?(\S+)?/i’, ‘\4‘, $data );
echo $data;
output = my text facebook.com/c.hodari90
Proposed code has a slight flaw. If $text contains two similar URLs, like “The text you want to filter has two URLs namely http://google.com but also http://google.com/index.html#hashtag” with both URLs starting the same, then the #hashtag in the second URL gets lost.
Since URLs inside a string are separated by spaces (I believe this is always the case), the following code works for me:
By the way, I use a different regex which does not match URLs that contain forbidden characters like @
Anf finally… what a pain in the back to get this comment displayed the right way (I hope…).
Your code worked, but you forgot to close the tag!
I changed
$replacement = ““.$match.””;
to
$replacement = ““.$match.”“;
Your code doesn’t print the text if there is an url present, therefor changed this:
// if URLs in the text, return the text after
// removing the leading and trailing spaces
$text = trim(nl2br($text), ” “);
to
// if URLs in the text, return the text after
// removing the leading and trailing spaces
$text = trim(nl2br($text), ” “);
echo $text;
Hope this helps someone! :)
Try this for multiple urls :
function findURLs($text)
{
I coded this myself before stumbling across this snippet – I needed to parse links in tweets stored in my site’s database.
The only difference is that my version parses multiple links.
search anyone how to get first link url in curl php
plz help me
This works fine for me to format posted comments for publication:
what is pattern to use for find email from url
I tried this
$reg_exUrl = ‘/^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$/’;
not working pls help
I was looking for a solution that is lenient and allows for multiple urls formats with or without ‘http’ or ‘https’. None on this page worked for me, but I found a great script from markd on stackoverflow (http://stackoverflow.com/questions/1959062/how-to-add-anchor-tag-to-a-url-from-text-input)
It works for these URLs (and successfully leaves out trailing period or comma):
thankyou bro its working.
what exactly is these line
$replacement = ““.$match.”
i thinks is not working.
Thanks for this post and the comments. Through it I’ve been able to improve very much my older code :). With this post original’s, there are a few gaps that need to be solved:
1- As commented, you can’t have more than one URL in the text. This can be solved easily replacing “$url[0]” in the preg_replace() for “$1”
2- The script doesn’t care if the http:// link in your original text is already inside a html link. For solving this, you have to modify the beginning of the reg exp. to match only strings that are at the beginning of the string, that begin with a space or new line code: (^|\A|\s)
3- I want my code to catch URL’s starting with www. For this, I added another regexp filter also using the starting filter: (^|\A|\s). It won’t get “http://www.” links because before the “www” there are the slashes.
Hope this code helps someone. Comments allowed!
I was looking for a script that links existing images to their sourcefile with fancybox.
I used the function from Geert and did some changes.
$reg_exUrl = “/((((http|https|ftp|ftps):\/\/)|www.)[a-zA-Z0-9-.]+.[a-zA-Z]{2,4}(\/?\S*))/”;
This is working fine with all query string and slashes
Here is a nice function that turns text into links, including email links (sorry no FTP).
Instead of searching for any domain extension, I included the most popular ones, so that text like “example.fake” wouldn’t be considered a link. Other domain extensions can be easily added.
This also takes into account periods and commas.
It works for these values:
These values fail:
Mark, your solution is best. But how to set any domain extension. Like i need to set Italian domain (.it) In this case i have to add it manually in the pattern. It must be except any domain extension. Can you please help me?
Hi, I use the first code but how can I search for more words?
and if the first word is found then go to A, and the second word is found go to B etc…
// The Text you want to filter for urls
$text = “The text you want to filter goes here. http://google.com“;
There should be another example using
DOMDocument
Class :)In WordPress I like to make this a filter so I can use it anywhere quickly and easily.
You don’t need this if you’re using WordPress, because it ships with
make_clickable()
.After dedicating a few hours to writing php code to convert links, I am SO glad I saw Ian Dunn’s comment about WordPress’ make_clickable().
The code with regex does not work completely.
I made this code. It is much more comprehensive, but it works:
See the result here: Your text to link here…
See the source code here: Your text to link here…
Here is my short code to replace all URLs in string. Hope I helped you.
Thank you! Original method does not work. Presents a syntax error. But this one works great! And having multiple urls in the string is a must.
I have made function which will catch web link and image link
This will catch all which ends with jpeg, jpg, png and gif remember it wont catch which has gif?blabla
Thanks brother. Your code works nicely.
Just wanted to share how we could do this ruby if anyone is interested.
"The text you want to filter goes here. http://google.com".
gsub(/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/) {|s|
"<a href ='#{s}'>#{s}</a>"
}
The regex in the article works, but it also returns match groups, that you likely don’t want, and will muddy up your results. An easy fix for it, is to ignore those match groups with ?:
eg:
(?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\/\S*)?
This will return ONLY the url in a preg_match, and an array of urls in a preg_match_all.
WIN!
@ffsplus2
How do I go about reusing the $pattern variable more than once for the image? I tried using an echo within the string after assigning say $newurl = $pattern; but it didn’t work. The only alternative I could imagine is to use CSS to add before and after the url to that image. Reason for the url? Fancybox :P
Do any of these do it as we’re typing?
I’m using this:
Eh… scratch that. I just noticed it’s adding a gazillion links to every character :/
This solved my problem :)
Hi everyone, I have a code that renders a table from mysql, one of the fields is url for which I need the autolink function, I’ve been searching and testing a lot, but I can not find a solution, I would appreciate a lot if somebody could help me, here is my code:
<?php
$query = "SELECT * FROM
values
ORDER BYid
";$result = mysql_query($query);
if (!$result) {
die("Query to show fields from table failed");
}
$fields_num = mysql_num_fields($result);
echo "";
for($i=0; $i<$fields_num; $i++)
{
$field = mysql_fetch_field($result);
echo "".strtr(" {$field->name} ", $transname)."";
}
echo "\n";
while($row = mysql_fetch_row($result))
{
echo "";
foreach($row as $cell)
echo "$cell";
echo "\n";
}
mysql_free_result($result);
?>
I better post the complete code again, otherwise is a mess, sorry again:
What if the text has a mix of tagged URL’s and URL’s which are not tagged?
E.g. like this:
How can we prevent preg_replace() to pick up the url’s in the second one to avoid them to be replaced by another tag.
Damir, you got it. Thank you very much.
Olivier From France
Thanks Buddy,
Exactly the pattern what i was lookin for and i’d modified it for multiple url in single string but the idea was awesome thanks very much bro. Keep up the good work
Hi – setting up a new blog style database where users can post links. This is great – thank you community of concerned programmers.
-peter-
a better regex to get links including the new domains like music, auto, london and so on. it also catches links that doesn’t end with a slash and are just the domain. and if you want to parse html it doesn’t hit the quote at the and of and href or src attribute.
My problem here is in php”If i give one word as input,it will matches 2 or more urls then where the match is found it will go and open that url”.
For example,if i given a word “computerscience”,it will matches that in which url the word “computerscience” present like http:\www.compterscience.com that url is opened in next page.
please give reply
Please update the code. With limitation: {2,3}, it will not work with long extension which is longer than 3 characters, example: INFO
This will return Image as well as Link.. It will work for all kinds of Url (may be).. I’ve used it in Facebook it works in it..
/(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~|!:,.;]*[-A-Z0-9+&@#\/%=~|])/i
This regEx is working fine for me if my text have one URL. But if my text have more that one URL then from the second URL text it is not changing the text as URL.
Hi Everyone.
Below Sample Code will make all urls in the string into Links
Either it includes localhost etc etc links.
Some code snippets in this page have bugs.
Finally below code works for me. Note: FTP not support
Thanks so much for this! This is what I was looking for!
Anyways I just found a tiny bit of error like the others had.
It was just the matter of allowing double quotes inside two double quotes.
I just put backslash before the double quotes I wanna include inside.
Here was my fixed version.
{$url[0]} ", $text);
} else {
// if no urls in the text just return the text
echo $text;
}
?>
What if there is
http://something.com
and
link
in content how can we able to add link to only one as another one is auto link by default ?
Work with Regular Expression is not clear to understand whats go on… do is possible some body to write with out Regular Expression
Hi, thank you for this. I am not actually a programmer but I think you might be able to help. Using the same code, can you please help me do this:
Search for the text with the “@” at the beginning of the text (i.e. @google) then link the “@google” to Instagram (i.e. https://www.instagram.com/google) so @myname will link to https://www.instagram.com/my name
I am looking to repost funny images from Instagram but at the same time want to credit the source when I do the posting.
Thank you.
This blog was… how do you say it? Relevant!! Finally I’ve found something which helped me.
Thank you!
There is a Url highlight library available. It covers lots of edge cases. Check it out: https://github.com/vstelmakh/url-highlight