我有一个包含跟踪字符串,我想删除的字符串。 正则表达式似乎是最好的解决方案,但我想不出一个正则表达式,将工作。
示例网址:
- http://example.com?tracking=foo
- http://example.com/bar.html?tracking=foo
- http://example.com?tracking=foo¶m=baz
- http://example.com/bar.php?param=baz&tracking=foo
tracking=foo
应该被删除,其中foo
可以是除相当多的东西&
,没有跟踪网址不应该被感动。
最好的拍摄我得到的工作是/(http:\/\/[^?]*?.*)tracking=[^&]*&?(.*?["|\'])/i
但它也很相配多用[^&]*
-part从而消除了链接背后的一切,如果没有在跟踪字符串后的URL第二个参数。
而我使用它像这样的时刻$html
包含整个HTML的页面输出以及我想从内的所有网址中删除跟踪:
$html = preg_replace($pattern, '$1$2', $html);
所以$ HTML将包含至少应是这样的:
<body>
<a href="[one of the examples above]">Some Link</a>
</body>
你应该通过解析URL,使用做到这一点parse_url
和parse_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
。
/tracking=.*?(?=(&|$|\r|"))/
如果匹配所有tracking=foo
变量。 只是空字符串替换。
http://regexr.com?30ofo
作为修改自己的正则表达式(http:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?
如果匹配从字符串中删除所述第二组(一个与跟踪)