我有包含要删除的跟踪字符串的字符串。正则表达式似乎是最好的解决方案,但我想不出一个有效的正则表达式。
示例网址:
- 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
除了&
之外几乎可以是任何东西,没有跟踪的URL不应该被触及。
我得到的最好的镜头是/(http:'/'/[^?]*?.*)tracking=[^&]*&?(.*?["|''])/i
但它与[^&]*
部分匹配太多,因此如果跟踪字符串之后的 URL 上没有第二个参数,则消除了链接后面的所有内容。
我现在像这样使用它$html
它包含要输出的页面的整个 html,我想从其中的所有 url 中删除跟踪:
$html = preg_replace($pattern, '$1$2', $html);
因此,$html将包含的最小值将是这样的:
<body>
<a href="[one of the examples above]">Some Link</a>
</body>
您应该通过使用 parse_url
和 parse_str
解析 URL 来执行此操作。它使事情比使用正则表达式容易得多。
<?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
中的其余参数重建字符串。您可以使用 http_build_query
.
尝试这样的东西,虽然我还没有测试过它,所以需要一些修改:
$url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . http_build_query( $params);
对于您的特定用例,我会使用 PHP 的 DOMDocument
类来解析 HTML,然后从中获取所有 URL,然后使用上面的内容删除跟踪参数。但是,如果必须使用正则表达式,则可以使用通用正则表达式仅查找URL,然后将上述内容应用于使用preg_replace_callback
找到的每个URL。
/tracking=.*?(?=(&|$|'r|"))/
应匹配所有tracking=foo
变量。 只需替换为空字符串即可。
http://regexr.com?30ofo
作为对您自己的正则表达式(http:'/'/[^?]*?.*)(tracking=[^&]*)(.*)?
的修改
如果匹配,则从字符串中删除第二组(具有跟踪的组)