如何删除查询字符串并只获取网址?

时间:2011-08-06 23:20:33

标签: php query-string

我使用PHP构建当前页面的URL。有时,网址为

www.mydomian.com/myurl.html?unwantedthngs
请求

。我想删除?及其后面的所有内容(查询字符串),以便生成的URL变为:

www.mydomain.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;
}
?>

16 个答案:

答案 0 :(得分:514)

您可以在strtok

首次出现之前使用?来获取字符串
$url=strtok($_SERVER["REQUEST_URI"],'?');

答案 1 :(得分:63)

使用PHP Manual - 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.mydomian.com/myurl.html?unwan=abc',
    'http://www.mydomian.com/myurl.html',
    'http://www.mydomian.com',
    'https://mydomian.com/myurl.html?unwan=abc&ab=1'
);

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

将返回:

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

这是通过parse_url()传递示例网址但没有第二个参数的输出(仅供说明)。

这是使用:

构建url后的最终输出
foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   

输出:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html

答案 2 :(得分:51)

最佳解决方案:

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

如果您要将表单提交到同一个域,则无需在自己的http://domain.com中加入。

答案 3 :(得分:11)

$val = substr( $url, 0, strrpos( $url, "?"));

答案 4 :(得分:6)

你需要至少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

答案 5 :(得分:6)

最简单的方法

$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

答案 6 :(得分:2)

如果您想获取请求路径(more info):

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);

答案 7 :(得分:1)

您可以尝试:

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

因为我处理了相对URL和绝对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;
}

答案 10 :(得分:0)

试试这个

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

答案 11 :(得分:0)

也可以按照php manual comment

使用以下内容
<InlineUIContainer BaselineAlignment="Center">
    <ContentPresenter Content="123" />
</InlineUIContainer>

请注意,这仅适用于某些PHP环境,请按照该页面的下面的注释获取更多信息;

  

目的:当前PHP文件的URL路径名称path-info为N / A   并排除URL查询字符串。包括斜杠。

     

注意:这是在URL重写之前(即,按照原始   呼叫网址)。

     

注意:并非在所有PHP环境中都设置,并且绝对仅在具有   URL重写。

     

可以在网络模式下使用:是

     

在CLI模式下工作:否

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

假设您仍想获取不带查询参数的URL(如果未设置),只需使用简写的if语句来检查if ( ! inputfile.good() ) { ofstream outputfile(myfile); cout << "Enter your FIRST and LAST name." << endl; getline(cin, name); outputfile << name << endl; cout << "Hello " << name << endl; cout << "Enter your initial balance." << endl; cin >> balance; outputfile << balance << endl; // No need to explicitly close the file, as the destructor will handle that. } else { // etc.

strpos

答案 14 :(得分:-1)

如果您使用Laravel,这是一个简单的解决方案:

Str::before($request->getRequestUri(), '?')

答案 15 :(得分:-3)

试试这个:

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

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