2012-04-24 20 views
1

我收到了包含要刪除的跟蹤字符串的字符串。正則表達式似乎是最好的解決方案,但我無法想出一個能夠正常工作的正則表達式。正則表達式來過濾來自HTML中URL的跟蹤參數

網址示例:

tracking=foo應該被刪除,其中foo可以是除相當多的東西,無法跟蹤沒有跟蹤的網址。

我工作的最佳鏡頭是/(http:\/\/[^?]*?.*)tracking=[^&]*&?(.*?["|\'])/i,但它與[^&]*-匹配得太多,因此如果跟蹤字符串後沒有第二個參數,則會消除鏈接後面的所有內容。

而且我使用像這樣的時刻$html包含整個HTML的頁面輸出以及我想從所有URL中移除跟蹤:

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

所以最低的$ HTML將包含將是這樣的:

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

你們是不是要取出部分從字符串(帶有跟蹤)刪除第二組字符串開始到跟蹤字符串的結尾還是跟蹤字符串? – Gabber 2012-04-24 12:07:00

+0

@Gabber我想刪除跟蹤參數 - 例如'http://example.com?tracking = foo&param = baz'應該成爲'http://example.com?param = baz' – bardiir 2012-04-24 12:08:58

回答

4

你應該通過解析URL,使用parse_urlparse_str做到這一點。它使事情比使用正則表達式容易得多。

<?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); 

爲了您的具體使用情況,我會使用PHP的DOMDocument類來解析HTML,然後搶所有的網址,然後使用上面的刪除跟蹤參數。但是,如果您必須使用正則表達式,則可以使用通用正則表達式來查找URL,然後將上述內容應用於使用preg_replace_callback的每個URL。

+1

完美答案。添加一些評論到你的代碼,我會在我的「這是你應該如何回答」的例子列表:D – 2012-04-24 12:16:18

+0

看起來很有前途,我會試試這個:) – bardiir 2012-04-24 12:25:00

+0

這是工作很好,因爲它是非常穩定的漂亮很多任何用例 - >完美:) – bardiir 2012-04-24 13:00:45

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

應該匹配所有tracking=foo變量。只需替換爲空字符串即可。

http://regexr.com?30ofo

+0

它會匹配鏈接後的所有文檔的其餘部分:http://regexr.com?30off – bardiir 2012-04-24 12:24:26

+0

它很接近,但它有[一些問題](http:// regexr。 COM?30ofl)。很難創建一個正確處理每個案例的正則表達式。 – nickb 2012-04-24 12:25:45

+0

http://regexr.com?30ofo如何添加像'tracking =。*?(?=(&| $ | \ r |「))''''選項? – Jack 2012-04-24 12:26:41

0

作爲修改自己的正則表達式(http:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?

如果匹配來自