从网址中批量删除查询字符串的组成部分

时间:2019-03-29 22:20:42

标签: php mysql

我想将以下mySQL查询转换为快速的PHP解决方案。 这里的变量是$url,我要删除所有以以下字符串开头的内容,包括它们。

例如

domain.com/foo/bar?gcllid=abcdefghi

应该是

domain.com/foo/bar

这是查询

UPDATE browsing SET url = SUBSTRING_INDEX( url ,'?gclid',1), 
url = SUBSTRING_INDEX( url ,'&gclid',1), 
url = SUBSTRING_INDEX( url ,'?fbclid',1), 
url = SUBSTRING_INDEX( url ,'&utm_source',1),
url = SUBSTRING_INDEX( url ,'?utm_campaign',1),
url = SUBSTRING_INDEX( url ,'?utm_medium',1),
url = SUBSTRING_INDEX( url ,'?token',1),
url = SUBSTRING_INDEX( url ,'&fbclid',1),
url = SUBSTRING_INDEX( url ,'&utm_campaign',1),
url = SUBSTRING_INDEX( url ,'&utm_medium',1),
url = SUBSTRING_INDEX( url ,'&token',1);

2 个答案:

答案 0 :(得分:0)

您可以使用我做的这个小功能... \(o.0)/

$remove = ["foo"];
$url = 'domain.com/foo/bar?gcllid=abcdefghi&foo=bar';

function f($u,array$r){$x='?';if(!strpos($u,$x))return$u;parse_str(parse_url($u,6),$g);return rtrim(substr_replace($u,http_build_query(array_diff_key($g,array_flip($r))),strpos($u,$x)+1),$x);}




echo f($url,$remove);

输出

domain.com/foo/bar?gcllid=abcdefghi

Sandbox

如上所示,$remove中的所有“键”(区分大小写)均已删除。它们不只是以粗俗的方式“淘汰”。而是使用以下功能的组合:

  • parse_url-用于从网址获取查询字符串
  • parse_str-用于将查询字符串解析为数组
  • http_build_query-用于从数组重建查询字符串

我还有其他一些喜欢的功能,例如substr_replacertrimarray_diff_keyarray_flip和永远存在的strpos。 / p>

应该不用多说,但是您可以根据需要在keys列表中放入任意数量的$remove。通过仅返回URL,它也可以正确处理URL丢失的?查询字符串。如果查询字符串中只有?,它将删除?,因此不会尾随domain.com/foo/bar?gcllid=abcdefghi

例如,来自以下问题:

  

例如

     

domain.com/foo/bar

     

应该是

     

$remove = ["gcllid"]; $url = 'domain.com/foo/bar?gcllid=abcdefghi';

您只需使用以下输入:

domain.com/foo/bar

您将得到此输出

f

干杯!

* PS ,您可能想将其重命名为function byteLength(str) { // returns the byte length of an utf8 string var s = str.length; for (var i=str.length-1; i>=0; i--) { var code = str.charCodeAt(i); if (code > 0x7f && code <= 0x7ff) s++; else if (code > 0x7ff && code <= 0xffff) s+=2; if (code >= 0xDC00 && code <= 0xDFFF) i--; //trail surrogate } return s; } console.log('length should be 4: Length is ', byteLength('test')); console.log('length should be 4: Length is ', 'test'.length); console.log('length should be 5: Length is ', byteLength('test ')); console.log('length should be 5: Length is ', 'test '.length); console.log('length should be 3: Length is ', byteLength('Ḇ')); console.log('length should be 3: Length is ', 'Ḇ'.length); ...

答案 1 :(得分:0)

获取URL的所有部分,解析查询字符串,并获取与要删除和重建的URL之间的区别:

$delete = ['gclid', 'fbclid']; //add the rest to delete
$vars = parse_url($url);
parse_str($vars['query'], $output);
$new = array_key_diff($output, $delete);
$url = $vars['scheme'].$vars['host'].$vars['path'].'?'.implode('&', $new);

这是一个示例,您可能还想添加portuser等部分。另外,您可以在URL上使用http_build_query代替implode对值进行编码。