8

following code is used to find url from a string with php. Here is the code:

$string = "Hello http://www.bytes.com world www.yahoo.com";
preg_match('/(http:\/\/[^\s]+)/', $string, $text);
$hypertext = "<a href=\"". $text[0] . "\">" . $text[0] . "</a>";
$newString = preg_replace('/(http:\/\/[^\s]+)/', $hypertext, $string);
echo $newString;

Well, it shows a link but if i provide few link it doesn't work and also if i write without http:// then it doesn't show link. I want whatever link is provided it should be active, Like stackoverflow.com.

Any help please..

1

3 Answers 3

18

A working method for linking with http/https/ftp/ftps/scp/scps: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/]+!', "<a href=\"\\0\">\\0</a>",$str);

I strongly advise NOT linking when it only has a dot, because it will consider PHP 5.2, ASP.NET, etc. links, which is hardly acceptable.

Update: if you want www. strings as well, take a look at this.

Sign up to request clarification or add additional context in comments.

5 Comments

well @axiomer, but it's not active if i write www.example.com
Updated my solution with a link (I didn't test it but it should work, I think).
This doesn't work if the URL has a hyphen (-). The link ends before the hyphen.
this worked for me but I noticed that when I linked youtube videos it broke the link at the = sign so I modified it to work with youtube video links $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?&_/=]+!', "<a href=\"\\0\">\\0</a>",$str);
Updated code to make it work when the URL has a hyphen (-), % or = sign: $newStr = preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=\-&_/]+!', "<a href=\"\\0\">\\0</a>",$str);
3

If you want to detect something like stackoverflow.com, then you're going to have to check for all possible TLDs to rule out something like Web 2.0, which is quite a long list. Still, this is also going to match something as ASP.NET etc.

The regex would looks something like this:

$hypertext = preg_replace(
    '{\b(?:http://)?(www\.)?([^\s]+)(\.com|\.org|\.net)\b}mi',
    '<a href="http://$1$2$3">$1$2$3</a>',
    $text
);

This only matches domains ending in .com, .org and .net... as previously stated, you would have to extend this list to match all TLDs

1 Comment

This only works for the domain portion. If the string includes directories and/or files, the link will end before those.
0

@axiomer your example wasn't work if link will be in format:

https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl

correct solution:

preg_replace('!(http|ftp|scp)(s)?:\/\/[a-zA-Z0-9.?%=&_/]+!', "<a href=\"\\0\">\\0</a>", $content);

produces:

<a href="https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl">https://stackoverflow.com?val1=bla&val2blablabla%20bla%20bla.bl</a>

1 Comment

preg_replace('!(http|ftp|scp)(s)?:\/\/(.*)+!', "<a href=\"\\0\">\\0</a>", $str);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.