Как удалить строку запроса и получить только URL? - PullRequest
179 голосов
/ 07 августа 2011

Я использую PHP для создания URL текущей страницы.Иногда запрашиваются URL в виде

www.mydomian.com/myurl.html?unwantedthngs

.Я хочу удалить ? и все, что за ним следует (строка запроса), так что получающийся URL становится:

www.mydomain.com/myurl.html

Мой текущий код:

Ответы [ 14 ]

521 голосов
/ 07 августа 2011

Вы можете использовать strtok, чтобы получить строку до первого вхождения ?

$url=strtok($_SERVER["REQUEST_URI"],'?');
63 голосов
/ 07 августа 2011

Используйте 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;
}

?>

Редактировать (второй полный пример):

Обновлена ​​функция, позволяющая убедиться, что схема будет присоединена и никакие уведомления не появятся:

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
)

Это результат передачи URL-адреса примера через 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
51 голосов
/ 31 июля 2014

лучшее решение:

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

Не нужно указывать свой http://domain.com, если вы отправляете форму на тот же домен.

11 голосов
/ 07 августа 2011
$val = substr( $url, 0, strrpos( $url, "?"));
6 голосов
/ 09 сентября 2016

Самый простой способ

$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 голосов
/ 23 марта 2016

Вам понадобится по крайней мере 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

2 голосов
/ 09 октября 2013

Если вы хотите получить путь запроса ( больше информации ):

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);
1 голос
/ 11 февраля 2015

Поскольку я работаю как с относительными, так и с абсолютными 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;
}
1 голос
/ 02 мая 2013

Чтобы удалить строку запроса из URI запроса, замените строку запроса пустой строкой:

function request_uri_without_query() {
    $result = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
    if(!empty($query)) {
        $result = str_replace('?' . $query, '', $result);
    }
    return $result;
}
1 голос
/ 07 августа 2011

Вы можете попробовать:

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