2012-04-24 3 views
1

削除したいトラッキング文字列を含む文字列があります。正規表現は最良の解決策だったようですが、正常に動作する正規表現を見つけることができません。HTMLのURLからトラッキングパラメータをフィルタリングする正規表現

例のURL:

tracking=fooを削除する必要がありfooが除いてほとんど何もすることができます、トラッキングのないURLには触れないでください。

ベストショットは/(http:\/\/[^?]*?.*)tracking=[^&]*&?(.*?["|\'])/iですが、トラッキング文字列の後ろにURLに2番目のパラメータがない場合は、リンクの背後にあるすべてのものを排除して[^&]* -partとあまりにも一致します。

、私はこのようにそれを使用していた瞬間に$htmlが出力されるように、ページの全体のHTMLが含まれており、私は内のすべてのURLから追跡を削除する:

$html = preg_replace($pattern, '$1$2', $html); 

ので、最低$あなたがparse_urlparse_strを使用して、URLを解析することにより、これを行う必要があります

<body> 
<a href="[one of the examples above]">Some Link</a> 
</body> 
+0

から2番目のグループを削除すると一致した場合、あなたはから一部を削除しようとしています文字列の始まりを追跡文字列の末尾に、または単に文字列を追跡することにしますか? – Gabber

+0

@Gabberトラッキングパラメータを削除したいとします。たとえば、http://example.com?tracking = foo&param = bazはhttp://example.com?param = bazになります。 – bardiir

答えて

4

:HTMLはこのようなものになるだろう含まれています。それは、正規表現を使うよりもはるかに簡単です。

<?php 
$params = array(); 

$url = "http://example.com/bar.php?param=baz&tracking=foo"; 
$url_parts = parse_url($url); 

parse_str($url_parts['query'], $params); 

// Remove the "tracking" parameter 
if(isset($params['tracking'])) { 
    unset($params['tracking']); 
} 

今、あなただけの$url_parts部品と$params中のparamsの残りの部分を使用して文字列を再構築する必要があります。 http_build_queryでこれを行うことができます。

それはいくつかの変更が必要になりますので、私はそれをテストしていないものの、このような何かを試してみてください:あなたの特定のユースケースについては

$url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . http_build_query($params); 

、私はつかむ、その後、HTMLを解析するためにPHPのDOMDocumentクラスを使用しますそこからすべてのURLを取得し、上記を使用してトラッキングパラメータを削除します。ただし、正規表現を使用する必要がある場合は、汎用正規表現を使用してURLだけを検索し、preg_replace_callbackを使用して見つかった各URLに上記を適用することができます。

+1

パーフェクトアンサー。あなたのコードにいくつかのコメントを追加して、私はこれを持っています "これはあなたが答えるべきです"例リスト:D –

+0

非常に有望に見える、私はこれを試してみます:) – bardiir

+0

これは素晴らしいとかなり安定して以来多くのusecase - >完璧: – bardiir

2
/tracking=.*?(?=(&|$|\r|"))/ 

すべて一致する必要がありますtracking=foo変数。空の文字列に置き換えてください。独自の正規表現(http:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?

に変形例として

http://regexr.com?30ofo

+0

それはリンクの後のドキュメントの残りの部分にも一致します:http://regexr.com?30off – bardiir

+0

それは近いですが、それは[いくつかの問題がある](http:// regexr。 com?30ofl)。すべてのケースを正しく処理できる単一の正規表現を作成するのは難しいです。 – nickb

+0

http://regexr.com?30ofo '' tracking =。*?(?=(&$$ \\ | ')) ''のようなオプションを追加するのはどうですか? – Jack

0

それは文字列(追跡付き1)