2017-04-21 61 views
1

鏈接我要搜索和替換基於對應陣列上的鏈接。搜索和替換函授陣列

我寫了這個解決辦法,但我覺得這是一個有點簡單化,也許不足以有效地處理2000頁和15000個聯繫。你怎麼看?使用DOMDocument或正則表達式會更有效?謝謝您的回答。

$correspondences = array(
        "old/exercise-2017.aspx" => "/new/exercise2017.aspx", 
        "old/exercise-2016.aspx" => "/new/exercise2016.aspx", 
        "old/Pages/index.aspx" => "/new/en/previous-exercises/index.aspx" 
        ); 

$html = '<ul><li><a href="old/exercise-2017.aspx">Appraisal exercise 2017</a></li><li><a href="old/exercise-2016.aspx">Appraisal exercise 2016</a></li><li> <a href="old/Pages/index.aspx">Previous appraisal exercises</a></li></ul>'; 

foreach($correspondences as $key => $value) { 
    if(strpos($html, $key)) { 
     $html = str_replace($key, $value, $html); 
    } 
} 
echo $html; 

?> 
+0

你是不是想這樣做只是一次,編輯HTML頁面?或者在運行時提供頁面? – 2017-04-21 09:56:29

+0

事實上,HTML內容儲存在數據庫 – Falco

回答

1

這種方法不是最高效的,但只要您只做一次並存儲結果,它應該沒問題。鑑於你已經以這種方式實現了它,除非遇到實際的性能問題,否則你應該繼續使用它。

如果您試圖在運行時執行此操作(即每次修改頁面時都會發送該頁面),那麼,是的,這很可能是有問題的。每頁15000個字符串搜索可能會很慢。

在這種情況下,最明顯的變化將是一個由這樣的回答暗示:做一次,保存,而不是在運行時計算它的結果。

如果你必須在運行時執行它,那麼最佳解決方案將使用DOMDocument來獲取URL。如果可能的話,您可以根據一組規則進行替換(例如,如果/old/Pages/總是被轉換爲/new/en/previous-exercizes然後爲此執行邏輯)。或者,如果您必須單獨編碼每個路徑,則可以使用鍵入舊URL的字典來獲取新URL。

+0

我應該有更好的解釋,其中的數據來自所以我不認爲我是在運行時這樣做。所有數據(舊鏈接,新鏈接和內容來自數據庫)的想法是在數據庫中存儲新鏈接的新內容,然後感謝您的答案。 – Falco