正则表达式过滤从HTML网址跟踪参数(Regular Expression to filter tr

2019-10-16 15:30发布

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

示例网址:

  • 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可以是除相当多的东西& ,没有跟踪网址不应该被感动。

最好的拍摄我得到的工作是/(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>

Answer 1:

你应该通过解析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



Answer 2:

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

如果匹配所有tracking=foo变量。 只是空字符串替换。

http://regexr.com?30ofo



Answer 3:

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

如果匹配从字符串中删除所述第二组(一个与跟踪)



文章来源: Regular Expression to filter tracking parameters from URLs in HTML