1

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

示例网址:

tracking=foo应该删除foo几乎任何东西,除了&,不应该触摸没有跟踪的 URL。

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

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

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

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

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

3 回答 3

4

您应该通过使用parse_url和解析 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']); 
}

现在您只需要使用 in 中的部分和 in 中$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.

于 2012-04-24T12:12:06.193 回答
2
/tracking=.*?(?=(&|$|\r|"))/

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

http://regexr.com?30ofo

于 2012-04-24T12:22:39.753 回答
0

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

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

于 2012-04-24T12:33:04.063 回答