正则表达式从HTML中的URL过滤跟踪参数

时间:2012-04-24 11:58:41

标签: php regex string url

我有一些字符串,其中包含我想删除的跟踪字符串。正则表达式似乎是最好的解决方案,但我无法找到可行的正则表达式。

示例网址:

tracking=foo应该被移除,foo几乎可以是&以外的任何内容,不应该触及没有跟踪的网址。

我工作的最佳镜头是/(http:\/\/[^?]*?.*)tracking=[^&]*&?(.*?["|\'])/i,但它与[^&]*匹配太多 - 因此如果跟踪字符串后面的URL上没有第二个参数,则会删除链接后面的所有内容

我现在正在使用它$html包含要输出的页面的整个html,我想删除所有网址中的跟踪:

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

所以$ html包含的最小值将是这样的:

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

3 个答案:

答案 0 :(得分:4)

您应该通过使用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中的其余参数重建字符串。您可以使用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。

答案 1 :(得分:2)

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

应匹配所有tracking=foo个变量。只需用空字符串替换。

http://regexr.com?30ofo

答案 2 :(得分:0)

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

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