2011-06-20 82 views
1

我正在使用htmlpurifier創建我的網站的文本版本。 我現在需要用只有文本的URL替換所有的hrefs,即'www.example.com/aboutus'變成'www.example.com/text/aboutus'php將文本插入到href中

最初我在域上嘗試了一個簡單的str_replace (我使用域的全局變量),但問題是文件的鏈接也被取代,即 'www.example.com/document.pdf'變成'www.example.com/text/document.pdf',因此失敗。

是否有一個正則表達式,我可以說域替換域/文本的URL不包括字符串?

感謝任何指針你也許能夠給我:)

+0

這可能會更容易處理Javascript,考慮到JavaScript有DOM選擇器,不涉及通過正則表達式檢查整個頁面。 – MoarCodePlz

+0

@MoarCodePlz:PHP也一樣!你在說什麼? – netcoder

+0

單行通過jquery($('a')。each(function(){if($(this).attr('href')== SOMEQUALITY)$(this).attr('href',newValue) ;});比我知道的任何PHP實現都要簡單很多,我可能會錯過一些東西, – MoarCodePlz

回答

1

使用negative lookahead

$output = preg_replace(
      '#www.example.com(?!/text/)#', 
      'www.example.com/text', 
      $input 
     ); 

更重要的是,使用DOM它:

$html = '<a href="www.example.com/something">foo</a> 
     <p>hello</p> 
     <a href="www.example.com/text/documents">bar</a>'; 

libxml_use_internal_errors(true); // supresses DOM errors 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 

$hrefs = $xpath->query('//a/@href'); 
foreach ($hrefs as $href) { 
    $href->value = preg_replace(
         '#^www.example.com(?!/text/)(.*?)(?<!\.pdf)$#', 
         'www.example.com/text\\1', 
         $href->value 
        ); 
} 

這應該給你:

<a href="www.example.com/text/something">foo</a> 
<p>hello</p> 
<a href="www.example.com/text/documents">bar</a> 
+0

感謝netcoder - 剛開會,但聽起來很有趣!我會盡快回復。 – iltdev

+0

我回來了!我有使用DOM的問題,因爲我在某些元素上使用了名稱和id,所以我得到' ID已經定義在實體的錯誤。我一直在努力得到PHP的負面環視示例工作如果我運行$ inpu t =「http://www.example.com/aboutus
http://www.example.com/testing123
http://www.example.com/info/test
http://www.example.com /document.pdf「,我只把'aboutus'變成'text/aboutus'。所有其他人都像以前一樣。 – iltdev

+0

@ user287212:對於DOM,使用'libxml_use_internal_errors'來抑制錯誤。我修正了這個模式(在兩個例子中添加了尾部的'/',並在第一個例子的開始處刪除了'^')。查看更新的答案。 – netcoder