현재 페이지의 URL을 빌드하기 위해 PHP를 사용하고 있습니다. 때로는 다음 형식의 URL
www.mydomian.com/myurl.html?unwantedthngs
요청됩니다. ?
결과 URL이되도록 다음과 뒤에 오는 모든 항목 (querystring) 을 제거하고 싶습니다 .
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"], '?');
strtok()
은 ?
쿼리 문자열에서 하위 문자열을 직접 추출하는 가장 간결한 기술을 나타냅니다 . explode()
첫 번째 요소에 액세스해야하는 잠재적으로 2 요소 배열을 생성해야하기 때문에 덜 직접적입니다.
쿼리 문자열이 누락되거나 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
)
---
답변
사용 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;
}
?>
편집 (두 번째 전체 예) :
구성표가 첨부되고 통지 메시지가 표시되지 않도록 기능이 업데이트되었습니다.
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 버전 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
답변
다음과 같은 함수에서 parse_url 빌드를 사용할 수 있습니다.
$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);