2010-07-27 21 views
5

per esempio ho una stringa come questa:Modificare un URL relativo alla URL assoluto

$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> 
     '; 

e voglio aggiungere l'URL assoluto a tutti i HREF in cui viene dato alcun 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> 
     '; 

qual è il modo migliore per farlo? immagino qualcosa con RegEx, ma le mie competenze RegEx sono **;)

grazie in anticipo!

+0

Anche se regex potrebbe farti andare per il momento può rivelarsi pericoloso in un secondo punto del tempo. È meglio analizzarlo come xml, controllare se l'attributo inizia con 'http: //' e anteporre 'http: // miodominio.com /' se non lo è. – Amarghosh

+0

test dovrebbe essere aggiunto agli esempi ... – Hinek

risposta

9

trovato un buon modo:

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

è possibile utilizzare (?!http|mailto) se avete anche link mailto nel $ 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, ho formattato il codice per te così i nostri occhi non sanguinano quando lo leggiamo. –

1

La risposta precedente causerà problemi con il primo e il quarto esempio perché non include una barra diretta per separare la pagina dal nome della pagina. Certo, questo può essere risolto semplicemente aggiungendolo al dominio $, ma se lo fai allora href = "/ something.php" finirà con due.

solo per dare una soluzione Regex alternativa si potrebbe andare con qualcosa di simile ...

$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]; 
} 

Tuttavia vale la pena notare che con un link, come href = "example.html" il collegamento è relativo nella directory corrente, nessun metodo mostrato finora funzionerà correttamente per i collegamenti relativi che non si trovano nella directory radice. Al fine di fornire una soluzione che richiede maggiori informazioni sulla provenienza delle informazioni.