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

Nav*_*age 190 php query-string

我使用PHP来构建当前页面的URL.有时,URL的形式

www.mydomian.com/myurl.html?unwantedthngs
Run Code Online (Sandbox Code Playgroud)

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

www.mydomain.com/myurl.html
Run Code Online (Sandbox Code Playgroud)

我目前的代码是这样的:

<?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;
}
?>
Run Code Online (Sandbox Code Playgroud)

Ria*_*iaD 541

您可以strtok在第一次出现之前使用它来获取字符串?

$url=strtok($_SERVER["REQUEST_URI"],'?');
Run Code Online (Sandbox Code Playgroud)

  • +1直接使用$ _SERVER而不是重建网址只是为了再次解析它.如果可能的话会给另一个+1,简洁. (24认同)
  • 它不返回bool(false)如果?字符串中不存在,它返回字符串. (13认同)
  • 糟糕 - 反转那些爆炸()的参数,分隔符先行.`array_shift(爆炸( '?',$ _ SERVER [ "REQUEST_URI"]))` (7认同)
  • 好极了!即使`?`不存在,它仍然会返回url. (4认同)

ver*_*tas 64

使用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;
}

?>
Run Code Online (Sandbox Code Playgroud)

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

更新了函数以确保附加方案并且没有通知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));
}       
Run Code Online (Sandbox Code Playgroud)

将返回:

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
)
Run Code Online (Sandbox Code Playgroud)

这是通过parse_url()传递示例url而没有第二个参数的输出(仅用于解释).

这是使用以下构造url后的最终输出:

foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   
Run Code Online (Sandbox Code Playgroud)

输出:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html
Run Code Online (Sandbox Code Playgroud)

  • +1尽可能使用提供的功能! (3认同)

Lud*_*ord 53

最佳方案:

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
Run Code Online (Sandbox Code Playgroud)

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

  • 最佳答案 - 因为非常紧凑. (3认同)

zel*_*lio 12

$val = substr( $url, 0, strrpos( $url, "?"));
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是解决问题的一个相当甜蜜和简单的解决方案。不需要大量的扩展或功能。我用它来获取当前被调用的文件名。$base = basename($_SERVER['REQUEST_URI']); $page = substr($base, 0, strrpos($base, "?")); (2认同)

小智 8

最简单的方式

$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
Run Code Online (Sandbox Code Playgroud)


小智 7

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

$_SERVER["HTTP_HOST"].explode('?', $_SERVER["REQUEST_URI"], 2)[0];
Run Code Online (Sandbox Code Playgroud)

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


Moh*_*nji 6

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

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
Run Code Online (Sandbox Code Playgroud)


小智 5

explode('?', $_SERVER['REQUEST_URI'])[0]
Run Code Online (Sandbox Code Playgroud)