我想将以下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);
答案 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
如上所示,$remove
中的所有“键”(区分大小写)均已删除。它们不只是以粗俗的方式“淘汰”。而是使用以下功能的组合:
parse_url
-用于从网址获取查询字符串parse_str
-用于将查询字符串解析为数组http_build_query
-用于从数组重建查询字符串我还有其他一些喜欢的功能,例如substr_replace
,rtrim
,array_diff_key
,array_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);
这是一个示例,您可能还想添加port
,user
等部分。另外,您可以在URL上使用http_build_query
代替implode
对值进行编码。