2010-07-27 80 views
5

例如我有一個字符串,像這樣:更改相對URL絕對URL

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

,我想絕對URL追加到沒有abolute域給出所有的HREF。

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

最好的辦法是做什麼?我想用正則表達式,但我的RegEx技能是**;)

在此先感謝!

+0

雖然正則表達式可以讓你去暫且可以在以後很危險時間點。最好將它解析爲xml,檢查屬性是以「http://」開頭,如果不是,則前置'http:// mydomain.com /'。 – Amarghosh 2010-07-27 11:05:11

+0

test應該被添加到示例中... – Hinek 2010-07-27 14:43:57

回答

9

找到了一個好辦法:

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

你可以使用(?!http|mailto)如果你有同樣的mailto在$ 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,我爲您設置了代碼格式,以便我們在閱讀時不會流血。 – 2010-07-27 13:14:10

1

上一個答案會導致您的第一個和第四個示例出現問題,因爲它未能包含正斜槓來將頁面與頁面名稱分開。無可否認,這可以通過簡單地將它附加到$域來解決,但如果你這樣做,那麼href =「/ something.php」將以兩個結尾。

只給一個替代的解決方案正則表達式,你可以像這樣的東西去...

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

然而,值得注意的是,與諸如HREF =「example.html的」某條鏈路是相對的到目前的目錄,到目前爲止所顯示的任何方法都不能正確地處理不在根目錄中的相關鏈接。爲了提供一個解決方案,儘管需要更多信息來說明信息的來源。