Как удалить запрос и получить только URL?

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

www.mydomian.com/myurl.html?unwantedthngs 

запрашиваются. Я хочу удалить ? и все, что следует за ним (querystring), так что полученный 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; } ?> 

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

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

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

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

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

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

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

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

 $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 Version 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

Можешь попробовать:

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

Чтобы удалить строку запроса из 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-адресами, я обновляю решение 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; } 

Попробуй это

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

Попробуй это:

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

или

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