PHP로 GET 변수를 제거하는 아름다운 방법?
GET 변수를 포함한 완전한 URL을 가진 문자열이 있습니다.GET 변수를 삭제하는 가장 좋은 방법은 무엇입니까?한 개만 제거할 수 있는 좋은 방법이 있을까요?
이것은 작동하지만 그다지 아름답지 않은 코드입니다(내 생각에).
$current_url = explode('?', $current_url);
echo $current_url[0];
위의 코드는 모든 GET 변수를 삭제합니다.URL은 CMS에서 생성된 내 경우이므로 서버 변수에 대한 정보는 필요 없습니다.
좋아요, 모든 변수를 제거한다면, 아마도 가장 예쁜 것은
$url = strtok($url, '?');
여기 좀 봐.
가장 빠르고(아래 참조), '?'가 없는 URL을 적절하게 처리합니다.
url+querystring을 사용하여 변수를 하나만 삭제하려면(regex 치환을 사용하지 않고(경우에 따라 더 빠를 수 있음) 다음과 같은 작업을 수행할 수 있습니다.
function removeqsvar($url, $varname) {
list($urlpart, $qspart) = array_pad(explode('?', $url), 2, '');
parse_str($qspart, $qsvars);
unset($qsvars[$varname]);
$newqs = http_build_query($qsvars);
return $urlpart . '?' . $newqs;
}
단일 변수를 제거하기 위한 regex 교체는 다음과 같습니다.
function removeqsvar($url, $varname) {
return preg_replace('/([?&])'.$varname.'=[^&]+(&|$)/','$1',$url);
}
실행 사이에 타이밍이 재설정되도록 몇 가지 다른 방법의 타이밍을 설명합니다.
<?php
$number_of_tests = 40000;
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
preg_replace('/\\?.*/', '', $str);
}
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "regexp execution time: ".$totaltime." seconds; ";
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$str = explode('?', $str);
}
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "explode execution time: ".$totaltime." seconds; ";
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$qPos = strpos($str, "?");
$url_without_query_string = substr($str, 0, $qPos);
}
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "strpos execution time: ".$totaltime." seconds; ";
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$url_without_query_string = strtok($str, '?');
}
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "tok execution time: ".$totaltime." seconds; ";
드라마들.
regexp execution time: 0.14604902267456 seconds; explode execution time: 0.068033933639526 seconds; strpos execution time: 0.064775943756104 seconds; tok execution time: 0.045819044113159 seconds;
regexp execution time: 0.1408839225769 seconds; explode execution time: 0.06751012802124 seconds; strpos execution time: 0.064877986907959 seconds; tok execution time: 0.047760963439941 seconds;
regexp execution time: 0.14162802696228 seconds; explode execution time: 0.065848112106323 seconds; strpos execution time: 0.064821004867554 seconds; tok execution time: 0.041788101196289 seconds;
regexp execution time: 0.14043688774109 seconds; explode execution time: 0.066350221633911 seconds; strpos execution time: 0.066242933273315 seconds; tok execution time: 0.041517972946167 seconds;
regexp execution time: 0.14228296279907 seconds; explode execution time: 0.06665301322937 seconds; strpos execution time: 0.063700199127197 seconds; tok execution time: 0.041836977005005 seconds;
strtok이 이기고, 지금까지 가장 작은 코드입니다.
그럼 어떻게 해?
preg_replace('/\\?.*/', '', $str)
쿼리 문자열을 삭제하려는 URL이 PHP 스크립트의 현재 URL인 경우 앞에서 설명한 방법 중 하나를 사용할 수 있습니다.URL이 포함된 문자열 변수만 있고 '?' 뒤에 있는 모든 항목을 제거하려면 다음을 수행할 수 있습니다.
$pos = strpos($url, "?");
$url = substr($url, 0, $pos);
@MitMaro의 코멘트에서 영감을 얻어 @Gumbo, @Matt Bridges 및 @just의 솔루션 속도를 테스트하기 위한 작은 벤치마크를 질문에서 작성했습니다.
function teststrtok($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$str = strtok($str,'?');
}
}
function testexplode($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$str = explode('?', $str);
}
}
function testregexp($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
preg_replace('/\\?.*/', '', $str);
}
}
function teststrpos($number_of_tests){
for($i = 0; $i < $number_of_tests; $i++){
$str = "http://www.example.com?test=test";
$qPos = strpos($str, "?");
$url_without_query_string = substr($str, 0, $qPos);
}
}
$number_of_runs = 10;
for($runs = 0; $runs < $number_of_runs; $runs++){
$number_of_tests = 40000;
$functions = array("strtok", "explode", "regexp", "strpos");
foreach($functions as $func){
$starttime = microtime(true);
call_user_func("test".$func, $number_of_tests);
echo $func.": ". sprintf("%0.2f",microtime(true) - $starttime).";";
}
echo "<br />";
}
strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;strtok: 0.12;표준: 0.19;regexp: 0.31;strpos: 0.18;
결과: @justin의 strtok이 가장 빠릅니다.
주의: Apache2 및 PHP5를 사용하는 로컬 Debian Lenny 시스템에서 테스트되었습니다.
또 다른 해결책...이 함수는 쿼리 문자열에 삭제할 키가 하나뿐인 경우 후행 '?'도 제거됩니다.
/**
* Remove a query string parameter from an URL.
*
* @param string $url
* @param string $varname
*
* @return string
*/
function removeQueryStringParameter($url, $varname)
{
$parsedUrl = parse_url($url);
$query = array();
if (isset($parsedUrl['query'])) {
parse_str($parsedUrl['query'], $query);
unset($query[$varname]);
}
$path = isset($parsedUrl['path']) ? $parsedUrl['path'] : '';
$query = !empty($query) ? '?'. http_build_query($query) : '';
return $parsedUrl['scheme']. '://'. $parsedUrl['host']. $path. $query;
}
테스트:
$urls = array(
'http://www.example.com?test=test',
'http://www.example.com?bar=foo&test=test2&foo2=dooh',
'http://www.example.com',
'http://www.example.com?foo=bar',
'http://www.example.com/test/no-empty-path/?foo=bar&test=test5',
'https://www.example.com/test/test.test?test=test6',
);
foreach ($urls as $url) {
echo $url. '<br/>';
echo removeQueryStringParameter($url, 'test'). '<br/><br/>';
}
유언 출력:
http://www.example.com?test=test
http://www.example.com
http://www.example.com?bar=foo&test=test2&foo2=dooh
http://www.example.com?bar=foo&foo2=dooh
http://www.example.com
http://www.example.com
http://www.example.com?foo=bar
http://www.example.com?foo=bar
http://www.example.com/test/no-empty-path/?foo=bar&test=test5
http://www.example.com/test/no-empty-path/?foo=bar
https://www.example.com/test/test.test?test=test6
https://www.example.com/test/test.test
서버 변수를 사용하여 이 작업을 수행할 수 없습니까?
아니면 이 방법이 효과가 있을까요?
unset($_GET['page']);
$url = $_SERVER['SCRIPT_NAME'] ."?".http_build_query($_GET);
생각일 뿐이야.
예를 들어 서버 변수를 사용할 수 있습니다.$_SERVER['REQUEST_URI']
또는 그 이상의 기능:$_SERVER['PHP_SELF']
.
@list($url) = explode("?", $url, 2);
$_GET 배열을 루프하여 쿼리 문자열을 다시 쓰는 함수는 어떻습니까?
! 적절한 기능의 대략적인 개요
function query_string_exclude($exclude, $subject = $_GET, $array_prefix=''){
$query_params = array;
foreach($subject as $key=>$var){
if(!in_array($key,$exclude)){
if(is_array($var)){ //recursive call into sub array
$query_params[] = query_string_exclude($exclude, $var, $array_prefix.'['.$key.']');
}else{
$query_params[] = (!empty($array_prefix)?$array_prefix.'['.$key.']':$key).'='.$var;
}
}
}
return implode('&',$query_params);
}
이런 것은 페이지 링크 등에 편리한 것이 좋습니다.
<a href="?p=3&<?= query_string_exclude(array('p')) ?>" title="Click for page 3">Page 3</a>
basename($_SERVER['REQUEST_URI'])
는?, 를 포함한 모든 데이터를 반환합니다.
제 코드로 필요한 것은 섹션뿐일 수 있습니다.따라서 필요한 가치를 바로 얻을 수 있도록 구분해 주세요.다른 방법들에 비해 성능 속도는 잘 모르겠지만, 제게는 매우 유용합니다.
$urlprotocol = 'http'; if ($_SERVER["HTTPS"] == "on") {$urlprotocol .= "s";} $urlprotocol .= "://";
$urldomain = $_SERVER["SERVER_NAME"];
$urluri = $_SERVER['REQUEST_URI'];
$urlvars = basename($urluri);
$urlpath = str_replace($urlvars,"",$urluri);
$urlfull = $urlprotocol . $urldomain . $urlpath . $urlvars;
제 생각에 가장 좋은 방법은 다음과 같습니다.
<? if(isset($_GET['i'])){unset($_GET['i']); header('location:/');} ?>
i' GET 파라미터가 있는지 확인하고 있으면 삭제합니다.
echo'd javascript를 사용하여 자체 제출 형식의 변수를 모두 제거합니다.
<?
if (isset($_GET['your_var'])){
//blah blah blah code
echo "<script type='text/javascript'>unsetter();</script>";
?>
다음 javascript 함수를 만듭니다.
function unsetter() {
$('<form id = "unset" name = "unset" METHOD="GET"><input type="submit"></form>').appendTo('body');
$( "#unset" ).submit();
}
언급URL : https://stackoverflow.com/questions/1251582/beautiful-way-to-remove-get-variables-with-php
'programing' 카테고리의 다른 글
Java 지속성 / JPA: @Column vs @Basic (0) | 2023.01.01 |
---|---|
j쿼리 수 하위 요소 (0) | 2023.01.01 |
MySQL에서의 base64 부호화 (0) | 2023.01.01 |
'create_date' 타임스탬프 필드의 기본값이 잘못되었습니다. (0) | 2023.01.01 |
PEP8의 E128: 시각적 들여쓰기를 위한 언더인디드 연속선이란 무엇입니까? (0) | 2023.01.01 |