无法使用 PHP 删除 URL 中的问号 ? 及其后面的内容

3

我的网址结构如下:www.example.co.uk/dynamicpage/page?gclid=Cj0KCQ877xx

我想要删除www.example.co.uk/dynamicpage/page后面的所有内容。

我尝试了以下方法:

$data = explode('?',$data); $data = $data[0];

我还尝试使用 str_replace,但没有成功。

我尝试了其他人建议的解决相似问题的方法,但无论我做什么,它似乎都忽略了?之后的所有内容。

编辑

dynamicpage将根据在URL中键入的内容从我的数据库中提取城市/城镇名称,例如 www.example.co.uk/london 动态页面将显示伦敦内容。www.example.co.uk/london/page 也应该显示伦敦内容,它确实这样做,但不包括 ?gclid=Cj0KCQ877xx ,它只显示没有与伦敦相关的内容以及我设置的标准内容。

更新的代码

$data = "http://example.co.uk/dynamicpage/page?gclid=Cj0KCQ877xx"; 
$url_arr = parse_url($data); print_r($url_arr);

返回值

Array ( [scheme] => http [host] => example.co.uk [path] => /dynamicpage/page [query] => gclid=Cj0KCQ877xx )

编辑

使用htaccess解决问题

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} "gclid=" [NC]
RewriteRule (.*) /$1? [R=301,L,QSD]
<IfModule mod_rewrite.c>

1
var_dump($data) 返回什么? - user3783243
你的explode没问题。在使用explode前,你确定$data变量是你想要的吗? - Brett Gregson
你得到了什么结果? - devpro
展示完整的示例,因为您从其他地方获取了伦敦。 - devpro
@MarlinDOODOO,这个更新不是已经包含了你需要的所有内容吗?把schemehostpath组合在一起,如果你不关心scheme,可以将其排除在外。 - user3783243
显示剩余3条评论
6个回答

4

不清楚为什么你的方法不能正常工作,但更好的做法可能是使用parse_url函数。

$parts = parse_url('www.example.co.uk/dynamicpage/page?gclid=Cj0KCQ877xx');
echo $parts['path'];

3
使用htaccess重写URL
我相信gclid是Google标签管理器。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} "gclid=" [NC]
RewriteRule (.*) /$1? [R=301,L,QSD]
<IfModule mod_rewrite.c>

1
成功了 !!! 谢谢。不过,我必须将它放在其他htaccess重写的最上面才能工作。 - MarlinDOODOO

2
除了以上的建议,你还可以使用正则表达式来移除它:

除其他建议外,您还可以使用正则表达式将其删除:

$url = preg_replace('/\?.+$/', '', $url);

1

试试这个:

$url = strtok($url, '?');

$url 是你的 www.example.co.ukdynamic/page/page?gclid=Cj0KCQ877xx

在使用 strtok 后,它变成了 www.example.co.uk/dynamicpage/page


1
如果你想获取没有查询字符串的实际URL,则可以使用parse_url()函数:
<?php
$data = "www.example.co.uk/dynamicpage/page?gclid=Cj0KCQ877xx";
$url_arr = parse_url($data);
print_r($url_arr);
?>

Result:

Array ( 
    [path] => www.example.co.uk/dynamicpage/page 
    [query] => gclid=Cj0KCQ877xx 
    )

根据PHP手册parse_url()函数将返回URL的所有组件,因此您可以找到正确的路径。

动态页面每次都会不同。 - MarlinDOODOO
@MarlinDOODOO:parse_url会起作用的,首先将您的URL设置为动态的,然后在parse_url方法中使用它。 - devpro
你是在谈论伦敦吗?你想要移除伦敦吗?@MarlinDOODOO - devpro
没有问号,页面仍然显示在URL中,但返回的结果中已经删除了它,但gclid=Cj0KCQ877xx仍然存在。 - MarlinDOODOO
1
@MarlinDOODOO:能否请您更新您的问题并附上更新后的代码? - devpro

0
你可以使用 substr 函数来实现以下操作:
$data = substr($data, 0, strpos($data, "?"));

通过这种方式,您可以获取从开头到第一个“?”字符出现的索引的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接