PHP - Add link to a URL in a string

16,215

Solution 1

function processString($s) {
    return preg_replace('/https?:\/\/[\w\-\.!~#?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$s);
}

Solution 2

It breaks for all URLs that contain "special" HTML characters. To be safe, pass the three string components through htmlspecialchars() before concatenating them together (unless you want to allow HTML outside the URL).

Solution 3

function processString($s){
  return preg_replace('@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@', '<a href="$1">$1</a>', $s);
}

Found it here

Share:
16,215
AlexBrand
Author by

AlexBrand

Updated on July 23, 2022

Comments

  • AlexBrand
    AlexBrand almost 2 years

    I have a function that will add the <a href> tag before a link and </a> after the link. However, it breaks for some webpages. How would you improve this function? Thanks!

    function processString($s) 
    {
        // check if there is a link
    
        if(preg_match("/http:\/\//",$s))
        {
            print preg_match("/http:\/\//",$s);
    
    
            $startUrl =  stripos($s,"http://");
    
            // if the link is in between text
            if(stripos($s," ",$startUrl)){
                $endUrl = stripos($s," ",$startUrl);
            }
            // if link is at the end of string
            else {$endUrl = strlen($s);}
    
            $beforeUrl = substr($s,0,$startUrl);
            $url = substr($s,$startUrl,$endUrl-$startUrl);
            $afterUrl = substr($s,$endUrl);
    
            $newString = $beforeUrl."<a href=\"$url\">".$url."</a>".$afterUrl;
    
            return $newString;
        }
    
        return $s;
    }
    
  • Narcolessico
    Narcolessico almost 12 years
    I think a "=" is missing: it fails when the url contains get parameters. I just added it after the "&" and now it works: preg_replace('/https?:\/\/[\w\-\.!~?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$s)
  • Roman S
    Roman S about 11 years
    You forgot about addresses with # inside - so more correct version is preg_replace('/https?:\/\/[\w\-\.!~#?&=+\*\'"(),\/]+/','<a href="$0">$0</a>',$text)
  • Rhys
    Rhys almost 10 years
    I just edited the answer to reflect these two additions.
  • Alcalyn
    Alcalyn over 9 years
    Do not forget to add the 'u' modifier if your string may contains utf8 characters
  • Yuv
    Yuv over 9 years
    The same scenario I need it in Jquery/Javascript. Can anyone help ?
  • sNICkerssss
    sNICkerssss over 6 years
    I add one more char "%". As result: '/https?:\/\/[\w\-%\.!~#?&=+*\'"(),\/]+/','<a href="$0">$0</a>'