我有一些字符串,其中包含我想删除的跟踪字符串。正则表达式似乎是最好的解决方案,但我无法找到可行的正则表达式。
示例网址:
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>
答案 0 :(得分:4)
您应该通过使用parse_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']);
}
现在您只需使用$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)
答案 2 :(得分:0)
修改自己的正则表达式(http:\/\/[^?]*?.*)(tracking=[^&]*)(.*)?
如果匹配则从字符串中删除第二个组(具有跟踪的组)