0

C、XML、および XSL を使用してデーモンによって生成された HTML がたくさんあります。次に、HTML マークアップを取得して画面に表示する PHP スクリプトがあります。

私は XHTML 1 準拠のマークアップを大量に持っています。マークアップ内のすべてのリンクを変更して削除する必要があります&utm_source=report&utm_medium=email&utm_campaign=report

これまでのところ、2 つのオプションを検討しました。

  1. Analytics コードを削除する PHP バックエンドで正規表現検索を実行します。
  2. リンクをループする Jquery を記述してから、Analytics コードを href から削除します。

ハードル:

  1. HTML は巨大になる可能性があります。4MB 以上の IE (いくつかのテストを実行したところ、平均して約 100Kb でした)
  2. 高速である必要があります。約 3K の思考が得られますか?

現在、使用しようとしていますstr_replace('&utm_source=report&utm_medium=email&utm_campaign=report','',$html);が、機能していません。

4

8 に答える 8

2

sedまたは他の低レベルのツールを使用して、その部分を削除できます。

find /path/to/dir -type f -name '*.html' -exec sed -i 's/&utm_source=report&utm_medium=email&utm_campaign=report//g' {} \;

ただし、この文字列は URL だけでなく、どこからでも削除されます。ので注意してください。

于 2009-06-04T15:33:50.773 に答える
1

文字列が常に同じである場合、私が見つけた最速のphp関数はstrtrです

PHP strtr

string strtr ( string $str , string $from , string $to )

$html = strtr($html, array('&utm_source=report&utm_medium=email&utm_campaign=report' => ''));

明らかに、速度をベンチマークする必要がありますが、それはそこにあるはずです.

于 2009-06-04T15:30:25.320 に答える
0

最終的には、str_replace の使用を延期し、ドキュメントの内容全体で文字列を置換しました :(.

于 2009-06-04T20:25:14.460 に答える
0

私は数年前にこの問題に遭遇し、URL 内のこれらの utm 変数のインスタンスを置き換える次の正規表現を考え出しました:

/(\?|\&)?utm_[a-z]+=[^\&]+/

使用例:

preg_replace('/(\?|\&)?utm_[a-z]+=[^\&]+/', '', 'http://mashable.com/2010/12/14/android-quick-start-guide/?utm_source=twitterfeed&utm_medium=twitter&utm_campaign=Feed%3A+Mashable+%28Mashable%29');

体験談はこちらのブログに書きました

于 2012-11-22T03:41:47.687 に答える
0

HTML のチャンクが大きいので、これを外部プロセス (おそらく perl スクリプト) に渡します。

これほど多くのテキストを解析しようとしたことがないので、私は確信が持てませんが、PHP がこれを迅速に実行しないことは承知しています。

予想負荷は?この種の処理をどのくらいの頻度で行う必要がありますか? これは、バッチ操作として行うもののように思えますが、そのようなタスクに関する私の限られた経験では、必ずしも超高速である必要はありませんが、妥当な時間 (つまり、あなたはそれを一晩中待っているわけではありません)

于 2009-06-04T15:26:40.087 に答える
0

正規表現は一方向です。または、XPath を使用してドキュメント内のすべてのリンクを検索し、ループ内の各リンクで作業することもできます。これは XHTML ドキュメントであり、整形式であると仮定すると、このアプローチは合理的に見えます。

于 2009-06-04T15:27:51.207 に答える
0

バックエンドで CGI モードで実行すると、 PHPpreg_replace_all()はこれを非常に高速に実行します。cronjob を使用して php スクリプトを実行し、すべての HTML を処理してみませんか? したがって、フロントエンドの php-script は、処理されたコンテンツのみを計算せずにブラウザーに配置します。

于 2009-06-04T15:33:34.880 に答える
-1

実際には正規表現ではありませんが、役立つ場合があります(テストされていません):

$xmlPrologue = '<?xml version="1.0"?>';
$source = '...'; // you're business

$dom = new DOMDocument($source);
$dom->loadXML($source);

$links = $dom->getElementsByTagName('a');

foreach ($links as $link) {
    list($base, $queryString) = explode('?', $link->getAttribute('href'));

    // read GET parameters inside an array
    parse_str(, $queryString/* assigned by reference */);

    // get rid of unwanted GET params
    unset($queryString['utm_source']);
    unset($queryString['utm_medium']);
    unset($queryString['utm_email']);
    unset($queryString['utm_report']);

    // recompose query string
    $queryString = http_build_query($queryString, null, '&amp;');
    // or (not sure which we'll work the best)
    $queryString = http_build_query($queryString, null, '&');

    // assign the newly cleaned href attribute
    $link->setAttribute('href', $base . '?' . $queryString);
}

$html = $dom->saveXML();

// strip the XML declaration. Puts IE in quirks mode
$html = substr_replace($html, '', 0, strlen($xmlPrologue));
$html = trim($html);

echo $html;
于 2009-06-04T15:27:49.413 に答える