0

私はこれを理解するためにハンマーで頭を壊してきましたが、ここに行きます. 私は現在、さまざまなソースから取得したいくつかのページをスクレイピングしていますが、URL の末尾に次のように Google アナリティクスのがらくたが添付されていることがよくあります。

&utm_medium=something&utm_source=other

そして、URLからそれらを取り除こうとしています。これらは URL の末尾に追加されるため、次のようにします。

 $pattern = "^utm_source.*^";
 $interUrl = preg_replace($pattern, '', $url);

utm_source は、Google アナリティクスの URL の必須部分です。ここに私の問題が現れます。何らかの理由で、"^\&utm_source.*^" のようなアンパサンドに一致するパターンを取得できません。アンパサンド (およびそのエスケープ) がなければ、一致します。だから私は次のように「大したことはありません、私はただsubstrに行きます」と思いました:

 $finalUrl = substr($interUrl, 0, strlen($interUrl) - 1);

しかし、何も起こりません。-1 の数値を -3 または -4 に増やしましたが、アンパサンドの後の文字でさえ、何も途切れませんでした。str_replace や rtrim も試しましたが、アンパサンドを除外することはできませんでした。間違った URL が残っているので、これはイライラします。それだけでなく、ページをカールしようとすると 404 が返されますが、ブラウザからそのサイトにアクセスすると、正しいページにリダイレクトされます。

なぜこれが起こっているのかについてのアイデアはありますか?

答え

すべての答えは素晴らしく技術的でしたが、私は何かを理解するまで正規表現でたわごとを試み続けました. URL は、何らかの理由で (おそらく私の取得方法)、エンコードされていたため、次のように正規表現を微調整することになりました。

$pattern = "/&utm_source.*/";

そしてそれは動作します!みんなの助けに感謝します!

4

4 に答える 4

2

&あなたの場合、reg式の前に追加すると取引が成立します^&utm_source.*^

<?php 
  $ptn = "^&utm_source.*^";
  $str = "http://someurl.com?index.php&utm_medium=something&utm_source=other";
  $rpltxt = "";
  echo preg_replace($ptn, $rpltxt, $str); // http://someurl.com?index.php&utm_medium=something
?>

私は通常explode()、物事を単純化するために , を使用していますが、やはり URL を再構築する必要があります

parse_url()ただし、正規表現の代わりに試すこともできます。この場合は、正規表現の方が適している可能性があります。

于 2012-11-29T17:20:57.007 に答える
0

他の誰かが提案したようにparse_urlを使用することによって:

<?php
$str = 'http://www.mydomain.com/something.php?herp=derp&some=thing&utm_medium=something&utm_source=other';
$url_arr = parse_url($str);
$query_arr = explode('&', $url_arr['query']);
$final_arr = array();

for($i=0;$i<count($query_arr);$i++) {
        $tmp_arr = explode('=', $query_arr[$i]);
        if(!preg_match('/^utm_/', $tmp_arr[0])) {
                $final_query[] = $query_arr[$i];
        }
}

echo $finished_url = $url_arr['scheme'] . '://' . $url_arr['host'] . $url_arr['path'] . '?' . implode('&', $final_query);

//output: http://www.mydomain.com/something.php?herp=derp&some=thing
于 2012-11-29T17:42:28.603 に答える
0

すべての答えは素晴らしく技術的でしたが、私は何かを理解するまで正規表現でたわごとを試み続けました. URL は、何らかの理由で (おそらく私の取得方法)、エンコードされていたため、次のように正規表現を微調整することになりました。

$pattern = "/&amp;utm_source.*/";

そして、それは機能します。

なんでもっと早く捕まえなかったの?私はlaravelでアプリを実行していますが、ロギングシステムを使用するたびに、 & の代わりに実際のアンパサンドを使用しているように見えるため、すべてがうまくいったように見えました.

ある時点で、何が起こっているのかデータベースをチェックしたところ、URL が & ではなく & で終わっていることに気付きました (私のビューではこのように表示されていました)。

みんな、ありがとう!

于 2012-11-29T18:01:26.827 に答える
0

parse_strとを組み合わせて使用​​できます。http_build_query

parse_str($url, $vars);

if (isset($vars['utm_source'])) unset($vars['utm_source']);
// unset any other unwanted params the same way...

$finalUrl = http_build_query($vars);
于 2012-11-29T17:35:53.650 に答える