2010-07-27 20 views
5

Por ejemplo, yo tengo una cadena como esta:cambiar una dirección URL relativa a la URL absoluta

$html = ' 
      <a href="test.html">test</a> 
      <a href="http://mydomain.com/test.html">test</a> 
      <a href="http://otherdomain.com/test.html">test</a> 
      <a href="someothertest/otherdir/hi.html">hi</a> 
     '; 

y quiero añadir la url absoluta a todas las hrefs donde se da ningún dominio abolute.

$html = ' 
      <a href="http://mydomain.com/test.html">test</a> 
      <a href="http://mydomain.com/test.html">test</a> 
      <a href="http://otherdomain.com/test.html">test</a> 
      <a href="http://mydomain.com/someothertest/otherdir/hi.html">hi</a> 
     '; 

¿cuál es la mejor manera de hacerlo? Supongo que algo con RegEx, pero mis habilidades RegEx son **;)

gracias de antemano!

+0

Aunque expresiones regulares podría obtener vas por el momento, que puede resultar peligroso en una tarde punto de tiempo. Mejor analizarlo como xml, verificar si el atributo comienza con 'http: //' y anteponer 'http: // midominio.com' si no. – Amarghosh

+0

test debe agregarse a los ejemplos ... – Hinek

Respuesta

9

encontró una buena manera:

$html = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", '$1http://mydomain.com/$2$3', $html); 

puede utilizar (?!http|mailto) si tiene también enlaces mailto en tu $ html

4
$domain = 'http://mydomain'; 
preg_match_all('/href\="(.*?)"/im', $html, $matches); 
foreach($matches[1] as $n=>$link) { 
    if(substr($link, 0, 4) != 'http') 
     $html = str_replace($matches[1][$n], $domain . $matches[1][$n], $html); 
} 
+5

Romka, he formateado su código para que nuestros ojos no sangren cuando lo leemos. –

1

La respuesta anterior causará problemas con su primer y cuarto ejemplo porque no incluye una barra inclinada para separar la página desde el nombre de la página. Es cierto que esto puede solucionarse simplemente agregándolo al dominio $, pero si lo hace, entonces href = "/ something.php" terminará con dos.

Sólo para dar una solución alternativa expresión regular se puede ir con algo como esto ...

$pattern = '#'#(?<=href=")(.+?)(?=")#''; 
$output = preg_replace_callback($pattern, 'make_absolute', $input); 

function make_absolute($link) { 
    $domain = 'http://domain.com'; 
    if(strpos($link[1], 'http')!==0) { 
     if(strpos($link[1], '/')!==0) { 
      return $domain.'/'.$link[1]; 
     } else { 
      return $domain.$link[1]; 
     } 
    } 
    return $link[1]; 
} 

Sin embargo vale la pena señalar que con un enlace tales como href = "example.html" el vínculo es relativo para el directorio actual, ninguno de los métodos mostrados hasta ahora funcionará correctamente para los enlaces relativos que no están en el directorio raíz. Para proporcionar una solución, se necesitaría más información sobre el origen de la información.

Cuestiones relacionadas