PHP网址问题

时间:2010-08-12 17:10:01

标签: php

有没有办法可以使用PHP从链接中删除变量,例如,如果我有一个读取http://localhost/link/index.php?s=30&p=3的链接,我将如何删除?s=30&p=3,以便我的链接读取{{1} }}

9 个答案:

答案 0 :(得分:10)

list($url) = explode("?", $longUrl, 2);

答案 1 :(得分:6)

修改(suggested by Hoohah):

此外,您可以使用strstr()(PHP 5.3.0以后):

echo strstr($longurl, "?", TRUE);

PHP具有内置功能。<​​/ strong>

parse_url()。看一下可能的返回值。在这种情况下,我们可以使用schemehostpath

例如:

<?php
$info = parse_url("http://localhost/link/index.php?s=30&p=3");
echo $info["scheme"] . "://" . $info["host"] . $info["path"];
  // Output: http://localhost/link/index.php
?>

Live example


此方法优于使用explode()的优势在于,它可让您控制是否要显示用户名,密码和端口(如果包含)。上面的代码不会显示任何这些代码,因此http://user:pass@localhost:81/link/index.php?s=30&p=3将返回http://localhost/link/index.php,删除用户名,密码和端口号,这是我认为您想要的。用户名,密码和端口以$info["user"]$info["pass"]$info["port"]提供。

如果密码包含问号 explode()方法将失败。 This method doesn't fail even with ? and @ signs in the password


作为最后一点,如果您要处理端口号,用户名和密码,您可以使用下面的代码(有一行添加的行)来删除用户名和密码,但保留端口号:

<?php      
$info = parse_url("http://user:__?**@@@@&?ss@localhost:80/link/index.php?s=30&p=3");
  // If port is present add a colon before it, if not make it an empty string.
isset($info["port"]) ? $port = ":" . $info["port"] : $port ="";
echo $info["scheme"] . "://" . $info["host"] . $port . $info["path"];
  // Outputs: http://localhost:80/link/index.php
?>

Live example


最后,你真的不应该在链接中使用用户名和密码。来自RFC2396

  

某些URL方案在userinfo中使用“user:password”格式      领域。这种做法不推荐,因为通过了      已证明明文(例如URI)中的身份验证信息      几乎在所有使用过的情况下都存在安全风险。

答案 2 :(得分:2)

试试这个:

$pos = strpos($url, '?');
if($pos !== FALSE) {
   $url = substr($url, 0, $pos);
}

答案 3 :(得分:0)

$url = 'http://localhost/link/index.php?s=30&p=3';
$d = explode("?", $url);
$stripped = reset($d);

答案 4 :(得分:0)

我没有对此进行过测试,但您可能会执行以下操作:

$my_url = 'http://localhost/link/index.php?s=30&p=3';
$split = explode('?', $my_url);
$new_url = $split[0];

答案 5 :(得分:0)

$fullUrl = "http://localhost/link/index.php?s=30&p=3#dontreplace";
$urlData = parse_url($fullUrl);
$url = str_replace('?'.$urlData['query'],'',$fullUrl);

此解决方案考虑到您可以在参数后面添加一个#标签,但不会替换它。

如果你只是不关心什么是后?然后使用其他答案

答案 6 :(得分:0)

parse_url('http://localhost/link/index.php?s=30&p=3',PHP_URL_PATH);

答案 7 :(得分:0)

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

答案 8 :(得分:0)

如果U需要解析所请求的url,U可以简单地从全局变量中获取它:

// http://localhost/foo/bar?foo=bar&Foo1=Bar1
var_dump($_SERVER['QUERY_STRING']); // string(17) "foo=bar&Foo1=Bar1"

如果使用symfony / http-foundation组件,U可以从其Request类获取查询字符串,如下所示:

$request = \Symfony\Component\HttpFoundation\Request::createFromGlobals();
$queryString = $request->getQueryString();