用于过滤 HTML 中网址的跟踪参数的正则表达式


Regular Expression to filter tracking parameters from URLs in HTML

我有包含要删除的跟踪字符串的字符串。正则表达式似乎是最好的解决方案,但我想不出一个有效的正则表达式。

示例网址:

  • http://example.com?tracking=foo
  • http://example.com/bar.html?tracking=foo
  • http://example.com?tracking=foo&param=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_urlparse_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=[^&]*)(.*)?的修改

如果匹配,则从字符串中删除第二组(具有跟踪的组)