如何删除查询字符串,只得到URL?

我使用PHP构建当前页面的URL。的形式

www.example.com/myurl.html?unwantedthngs

是要求。我想删除?和它后面的所有东西(querystring),这样得到的URL变成:

www.example.com/myurl.html

我现在的代码是这样的:

<?php
function curPageURL() {
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {
$pageURL .= "s";
}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
$pageURL .= $_SERVER["SERVER_NAME"] . ":" .
$_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
} else {
$pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
}
return $pageURL;
}
?>
207480 次浏览

使用PHP手册- parse_url()来获取你需要的部件。

编辑(例如@Navi Gamage的用法)

你可以这样使用它:

<?php
function reconstruct_url($url){
$url_parts = parse_url($url);
$constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];


return $constructed_url;
}


?>

编辑(第二个完整示例):

更新功能,确保方案将附加,没有通知msgs出现:

function reconstruct_url($url){
$url_parts = parse_url($url);
$constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['path'])?$url_parts['path']:'');


return $constructed_url;
}


$test = array(
'http://www.example.com/myurl.html?unwan=abc',
`http://www.example.com/myurl.html`,
`http://www.example.com`,
`https://example.com/myurl.html?unwan=abc&ab=1`
);


foreach($test as $url){
print_r(parse_url($url));
}

将返回:

Array
(
[scheme] => http
[host] => www.example.com
[path] => /myurl.html
[query] => unwan=abc
)
Array
(
[scheme] => http
[host] => www.example.com
[path] => /myurl.html
)
Array
(
[scheme] => http
[host] => www.example.com
)
Array
(
[path] => example.com/myurl.html
[query] => unwan=abc&ab=1
)

这是通过不带第二个参数的parse_url()传递示例url的输出(仅供解释)。

这是使用构造URL后的最终输出:

foreach($test as $url){
echo reconstruct_url($url) . '<br/>';
}

输出:

http://www.example.com/myurl.html
http://www.example.com/myurl.html
http://www.example.com
https://example.com/myurl.html
$val = substr( $url, 0, strrpos( $url, "?"));

你可以试试:

<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>

你可以使用strtok?第一次出现之前获取字符串

$url = strtok($_SERVER["REQUEST_URI"], '?');

strtok()代表了直接提取查询字符串中?之前的子字符串的最简洁技术。explode()不那么直接,因为它必须生成一个潜在的两元素数组,其中第一个元素必须被访问。

其他一些技术可能会在查询字符串丢失或url中其他/非预期的子字符串发生变化时中断——这些技术应该避免。

示范:

$urls = [
'www.example.com/myurl.html?unwantedthngs#hastag',
'www.example.com/myurl.html'
];


foreach ($urls as $url) {
var_export(['strtok: ', strtok($url, '?')]);
echo "\n";
var_export(['strstr/true: ', strstr($url, '?', true)]); // not reliable
echo "\n";
var_export(['explode/2: ', explode('?', $url, 2)[0]]);  // limit allows func to stop searching after first encounter
echo "\n";
var_export(['substr/strrpos: ', substr($url, 0, strrpos( $url, "?"))]);  // not reliable; still not with strpos()
echo "\n---\n";
}

输出:

array (
0 => 'strtok: ',
1 => 'www.example.com/myurl.html',
)
array (
0 => 'strstr/true: ',
1 => 'www.example.com/myurl.html',
)
array (
0 => 'explode/2: ',
1 => 'www.example.com/myurl.html',
)
array (
0 => 'substr/strrpos: ',
1 => 'www.example.com/myurl.html',
)
---
array (
0 => 'strtok: ',
1 => 'www.example.com/myurl.html',
)
array (
0 => 'strstr/true: ',
1 => false,                       // bad news
)
array (
0 => 'explode/2: ',
1 => 'www.example.com/myurl.html',
)
array (
0 => 'substr/strrpos: ',
1 => '',                          // bad news
)
---

要从请求URI中删除查询字符串,请将查询字符串替换为空字符串:

function request_uri_without_query() {
$result = $_SERVER['REQUEST_URI'];
$query = $_SERVER['QUERY_STRING'];
if(!empty($query)) {
$result = str_replace('?' . $query, '', $result);
}
return $result;
}

如果你想获取请求路径(更多信息):

echo parse_url($_SERVER["REQUEST_URI"])['path']

如果你想删除查询和(也可能是片段):

function strposa($haystack, $needles=array(), $offset=0) {
$chr = array();
foreach($needles as $needle) {
$res = strpos($haystack, $needle, $offset);
if ($res !== false) $chr[$needle] = $res;
}
if(empty($chr)) return false;
return min($chr);
}
$i = strposa($_SERVER["REQUEST_URI"], ['#', '?']);
echo strrpos($_SERVER["REQUEST_URI"], 0, $i);

试试这个

$url_with_querystring = 'www.example.com/myurl.html?unwantedthngs';
$url_data = parse_url($url_with_querystring);
$url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);

最好的解决办法:

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

如果你提交一个表单到同一个域,就不需要在你的<form action="">中包含你的http://example.com

因为我同时处理相对和绝对url,所以我更新了veritas的解决方案,如下所示 你可以在这里自己试试:https://ideone.com/PvpZ4J

function removeQueryStringFromUrl($url) {
if (substr($url,0,4) == "http") {
$urlPartsArray = parse_url($url);
$outputUrl = $urlPartsArray['scheme'] . '://' . $urlPartsArray['host'] . ( isset($urlPartsArray['path']) ? $urlPartsArray['path'] : '' );
} else {
$URLexploded = explode("?", $url, 2);
$outputUrl = $URLexploded[0];
}
return $outputUrl;
}

试试这个:

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']

你至少需要PHP版本5.4来实现这个解决方案,而不是在一行中爆炸成一个变量并连接到下一行,但一个简单的一行将是:

$_SERVER["HTTP_HOST"].explode('?', $_SERVER["REQUEST_URI"], 2)[0];

服务器变量:http://php.net/manual/en/reserved.variables.server.php
数组解引用:https://wiki.php.net/rfc/functionarraydereferencing

最简单的方法

$url = 'https://www.youtube.com/embed/ROipDjNYK4k?rel=0&autoplay=1';
$url_arr = parse_url($url);
$query = $url_arr['query'];
print $url = str_replace(array($query,'?'), '', $url);


//output
https://www.youtube.com/embed/ROipDjNYK4k

也可以根据PHP手动注释

$_SERVER['REDIRECT_URL']

请注意,这只适用于特定的PHP环境,并从该页面下面的评论了解更多信息;

目的:当前PHP文件的URL路径名,path-info为N/A 和不包括URL查询字符串。

注意:这是在URL重写之前(即它是按照原始的 调用URL)。< / p > 注意:不是在所有的PHP环境中都设置,而且肯定只有那些有 URL重写。< / p >

在web模式下工作:是的

CLI模式下:不支持

你可以像这样使用parse_url内置函数:

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

假设你仍然想要在没有查询参数的情况下获得URL(如果它们没有设置),只需使用一个简略的if语句来检查strpos:

$request_uri = strpos( $_SERVER['REQUEST_URI'], '?' ) !== false ? strtok( $_SERVER["REQUEST_URI"], '?' ) : $_SERVER['REQUEST_URI'];
explode('?', $_SERVER['REQUEST_URI'])[0]