2010-11-18 6 views
9

J'ai une fonction qui ajoutera la balise <a href> avant et un lien </a> après le lien. Cependant, il se brise pour certaines pages Web. Comment amélioreriez-vous cette fonction? Merci!PHP - Ajouter un lien à une URL dans une chaîne

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; 
} 
+0

Le regex est un peu bâclée, mais 99% de mon entrée aura des URL correctes si une – AlexBrand

+4

Qu'est-ce que les pages Web-t-il pour briser? –

+0

Au début vous testez aussi https aussi, mais plus tard vous omettez le "s". Ne sais pas, si cela cause cette erreur, parce que je ne sais pas, quelles pages sont cassées;) – KingCrunch

Répondre

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

Je pense qu'un "=" est manquant: il échoue lorsque l'URL contient des paramètres get. Je viens d'ajouter après le "&" et maintenant il fonctionne: 'preg_replace ('/ https:.! \/\/[\ W \ - \ ~ & = + \ * \'"(), \ /] +/'' $0 '$ s) ' – Narcolessico

+4

Vous avez oublié sur les adresses aveC# intérieur - donc plus version correcte est' preg_replace ('/https:.! \/\/[\ w \ - \ ~ # ? & = + \ * \ '"(), \ /] + /', '$0', $ text)' –

+0

Je vient de modifier la réponse à ces deux ajouts reflètent. –

1

Il casse pour toutes les URL contenant des caractères HTML "spéciaux". Pour être sûr, passez les trois composants de chaîne via htmlspecialchars() avant de les concaténer ensemble (sauf si vous voulez autoriser le HTML en dehors de l'URL).

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

Je l'ai trouvé here

+0

échoue ici: ' http: //www.xyz.com/~this-does-not-work ' – stillstanding

+0

correspond à "un ... a" - bizarre – AlexBrand

+0

Le même scénario que j'ai besoin dans Jquery/Javascript quelqu'un peut-il aider!.? – Yuv

Questions connexes