1

I have got a function that converts strings like 'www.example.com' and 'http://example.com' in hyperlinks. It also deals with subdomains e.g. 'http://sub.example.com'.

But it fails with this one - http://www.example.com' and outputs the following

<a href="http://<a href="http://www.chemica.ru">www.chemica.ru</a>">http://<a href="http://www.chemica.ru">www.chemica.ru</a></a>

Please, can anyone help? The problem is that both 'http://' and 'www.' are together and both have different ways of converting.

function makeLinks($text){ 
 $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="\\1">\\1</a>', $text); 
 $text = eregi_replace('(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)', '<a href="http://\\1">\\1</a>', $text);
 $text = eregi_replace('([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})', '<a href="mailto:\\1">\\1</a>', $text); 
 return $text; 
}
3
  • 3
    FYI, eregi_* functions are deprecated. You should switch to preg_replace at some point in the near future. Commented Sep 21, 2010 at 17:18
  • PCRE allows for more advanced regex features than POSIX, as well. Commented Sep 21, 2010 at 18:01
  • possible duplicate of How to extract http links from a paragraph and store them in a array on php Commented Jan 28, 2012 at 20:16

3 Answers 3

4

just write to your view's page (you dont need any library or helper function) :

$text = "Good Site is http://masalahkita.com";
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text);

echo $link;
Sign up to request clarification or add additional context in comments.

1 Comment

This code works up to PHP7.2.31 but fails from 7.3 onwards ("preg_replace(): Compilation failed: invalid range in character class at offset 14"). See sandbox.onlinephpfunctions.com/code/…
2

You might want to read this blog post by Jan Goyvaerts for some ideas on how to find URLs in text.

To solve your immediate problem, you could add a negative lookbehind to your second regex: (?<!http://)(www.[-a-zA-Z0-9@:%_\+.~#?&/=]+) ensures that www... will only be matched if it is not preceded by http://.

However, ereg functions are deprecated and don't support lookaround, so you'll need to use preg_replace().

$text = preg_replace('/(?<!http:\/\/)(www.[-a-zA-Z0-9@:%_\+.~#?&\/=]+)/i', '<a href="http://\1">\1</a>', $text);

should work.

Comments

0

For both 'http://' and 'www.' together, you can do something like this:

$text = "http://www.example.com is a nice site";
$link = preg_replace("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i","<a target=\"_blank\" href=\"$1\">$1</a>", $text);
echo $link;

Works for URLs starts with http://

1 Comment

As above in andy's solution - this works up until PHP7.3

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.