当前位置: 首页 > 面试题库 >

用PHP删除GET变量的漂亮方法?

欧阳正卿
2023-03-14
问题内容

我有一个带有完整URL的字符串,其中包括GET变量。删除GET变量的最佳方法是哪种?是否有一种删除其中一个的好方法?

这是一个有效的代码,但不是很漂亮(我认为):

$current_url = explode('?', $current_url);
echo $current_url[0];

上面的代码仅删除了所有GET变量。在我的情况下,URL是从CMS生成的,因此我不需要有关服务器变量的任何信息。


问题答案:

好吧,删除所有变量,也许最漂亮的是

$url = strtok($url, '?');

请看strtok这里。

它是最快的(请参见下文),并且在处理网址时不带“?” 正确地。

要采用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;
}

用正则表达式替换删除单个var可能类似于:

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获胜,并且是迄今为止最小的代码。



 类似资料:
  • 我有以下重写规则, 重写引擎上 重写Cond%{REQUEST_FILENAME}!-f 重写Cond%{REQUEST_FILENAME}!-d 重写规则 ^(.*)$ ci.php?/1美元[L] 上面是抹去GET参数。在阅读了这里的一些帖子后,我使用了[QSA]参数,希望GET变量会附加到url中。但是它不起作用。 重写引擎上 重写Cond%{REQUEST_FILENAME}!-f 重写C

  • 问题内容: Go中有类似Ruby的东西吗? 例如,在Ruby中,您可以编写: 输出将是: 我能找到的最接近的东西是 问题答案: 如果您的目标是避免导入第三方软件包,则另一个选择是使用json.MarshalIndent: 输出: 工作示例:http : //play.golang.org/p/SNdn7DsBjy

  • 问题内容: 我正在构建一个PHP脚本,该脚本将JSON数据提供给另一个脚本。我的脚本将数据构建到一个大的关联数组中,然后使用来输出数据。这是一个示例脚本: 上面的代码产生以下输出: 如果您的数据量很少,那就太好了,但是我希望遵循以下几点: 有没有办法在PHP中做到这一点而又没有丑陋的破解?似乎有人在Facebook上找到了答案。 问题答案: PHP 5.4提供了用于调用的选项。 http://ph

  • 问题内容: 我正在创建一个JSON文件的脚本。现在,我只是使用(PHP 5.2.x)将数组编码为JSON输出。然后,我将返回值打印到文件中并保存。问题是客户端希望能够打开这些JSON文件以提高可读性,因此我想在其中添加换行符并“漂亮打印” JSON输出。有关如何执行此操作的任何想法?我唯一可以看到的替代方法是完全不使用,而只是手动写入文件内容,并为每行添加自己的换行符。 这是我得到的: 这就是我想

  • 问题内容: 我知道您可以在htaccess中添加规则,但是我看到PHP框架无法做到这一点,并且您仍然拥有漂亮的URL。如果服务器不知道URL规则,他们该怎么做? 我一直在寻找Yii的 网址管理器类,但我不知道它是如何做到的。 问题答案: 通常,通过使用以下规则将所有请求路由到单个入口点(根据该请求执行不同代码的文件)来完成: 然后,该文件将请求()与路由列表进行比较- 匹配请求的模式到控制器动作(

  • 问题内容: 每个体面的PHP程序员都有一个使用或包装,他们喜欢并分配快捷键,为什么我们不 共享我们喜欢的 快捷键。 问题答案: 在问了整整一年的时间和精力之后,我终于开源了我的var_dump版本,Kint。在项目页面或直接在github中阅读它。