2017-04-21 15 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ページを編集するには、これを1回だけ実行しようとしていますか?または、実行時にページが提供されるとき? –

+0

実際には、htmlコンテンツはDBに格納されています – Falco

答えて

1

このアプローチは最も効率的ではありませんが、1回だけ実行して結果を保存するのであれば問題ありません。この方法ですでに実装されていることを考えれば、実際のパフォーマンスの問題に遭遇しない限り、そのまま使用してください。

実行時にこれを実行しようとしている場合(つまり、ページが1回配信されるたびにページを変更する場合)、はい、問題が多いようです。 1ページあたり15000文字列の検索が遅くなる可能性があります。

この場合、最も明白な変更は、実行時に計算するのではなく、一度実行して結果を保存するという、この回答が意味する変更です。

にする必要があります。実行時に最適化するには、DOMDocumentを使用してURLを取得します。可能であれば、一連のルールに基づいて置き換えることができます(たとえば、/old/Pages/が常に/new/en/previous-exercizesに変換され、ロジックが実装されている場合など)。または、各パスを個別にコーディングする必要がある場合は、古いURLをキーにした辞書を使用して新しいURLを取得することもできます。

+0

データがどこから来たのかをよく説明する必要があったので、実行時にそれをやっているとは思わなかった。すべてのデータ(古いリンク、新しいリンク、およびコンテンツはデータベースから来ています)は、データベースに新しいリンクを持つ新しいコンテンツを保存するというアイデアを持っています。 – Falco