2010-11-18 16 views
9

Tengo una función que agregará la etiqueta <a href> antes de un enlace y </a> después del enlace. Sin embargo, se rompe para algunas páginas web. ¿Cómo mejorarías esta función? ¡Gracias!PHP - Agregar enlace a una URL en una cadena

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

La expresión regular es un poco descuidado, pero el 99% de mi entrada tendrá direcciones URL correctas en su caso – AlexBrand

+4

Qué páginas web ¿Rompe para? –

+0

Al principio, prueba contra https también, pero luego omite la "s". No sé, si esto causa este error, porque tampoco sé qué páginas están rotas;) – KingCrunch

Respuesta

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

Creo que falta "=": falla cuando la URL contiene los parámetros de obtención. Acabo de agregarlo después del "&" y ahora funciona: 'preg_replace ('/ https?: \/\/[\ W \ - \.! ~? & = + \ * \'"(), \ /] +/',' $0 ', $ s) ' – Narcolessico

+4

Olvidaste las direcciones con # adentro, por lo que la versión más correcta es' preg_replace ('/https?: \/\/[\ W \ - \.! ~ # ? & = + \ * \ '"(), \ /] + /', '$0', $ text)' –

+0

Acabo de editar la respuesta para reflejar estas dos adiciones. –

1

Se rompe para todas las URLs que contienen caracteres "especiales" HTML. Para estar seguro, pase los tres componentes de cadena a través de htmlspecialchars() antes de concatenarlos juntos (a menos que desee permitir HTML fuera de la URL).

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

encontrado que here

+0

falla aquí: ' http: //www.xyz.com/~this-does-not-work! ' – stillstanding

+0

coincide con" a ... a "- extraño – AlexBrand

+0

El mismo escenario lo necesito en Jquery/Javascript. ¿Alguien puede ayudar? – Yuv

Cuestiones relacionadas