2010-08-12 87 views
2

有沒有一種方法可以讓我帶出使用PHP例如鏈接中的變量,如果我有一個鏈接,上面寫着http://localhost/link/index.php?s=30&p=3我將如何去掉?s=30&p=3所以我的鏈接讀取http://localhost/link/index.phpPHP網址問題

回答

10
​​
+0

這似乎是這個問題的所有解決方案的母親。一行,不要太慢,即使沒有問號也能正常工作。尼斯。 – scy 2010-08-12 17:32:28

2

試試這個:

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

不考慮'''不是ppear。 「如果給出的長度爲0,** FALSE **或NULL,則將返回一個空字符串[from substr]。」 – Artefacto 2010-08-12 17:12:58

+0

@Artefacto,現在它:) – 2010-08-12 17:14:13

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

三行而不是一行,可能比雅各布的建議慢一點。 – scy 2010-08-12 17:14:09

+0

是否自動爆炸分隔'?' ?實際上 - 你似乎使用重置。哦,我看到 - 我認爲應該讀$ stripped = reset($ d); – 2010-08-12 17:15:25

+0

@scy當沒有查詢字符串時,Jacob的解決方案不起作用,這些「3行」實際上是兩個(一個是輸入定義),並且可以很容易地將1與trunk的數組解引用。 – Artefacto 2010-08-12 17:15:29

0

我沒有測試過這一點,但你也許可以這樣做:

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

既然你什麼時候可以省略php中的'$':)? – svens 2010-08-12 17:19:00

+0

heh。哦,是的,哎呀。不要寫太多的PHP了。我已更新以免造成混淆。謝謝。 – 2010-08-12 21:23:12

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

該解決方案考慮到您可以在參數後面加上hashtag並且不會替代它。

如果你只是不在乎以後是什麼?然後用其他的答案

6

編輯(suggested by Hoohah):

您也可以使用strstr()(PHP 5.3.0以後):

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

PHP有一個內置的功能,此。

它是parse_url()。看看可能的返回值。在這種情況下,我們可以使用scheme,hostpath

例如:

<?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:[email protected]: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:__?**@@@@&[email protected]: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方案使用的格式:在用戶信息 場「用戶密碼」。不推薦這種做法,因爲已經證明 身份驗證信息以明文形式(如URI)的傳遞在幾乎所有使用它的情況下都是安全風險。

+0

哎。傷害你必須以粗體寫出第一句話。有點尷尬,我們忘了parse_url()存在。這是迄今爲止最乾淨的解決方案,是的。 – scy 2010-08-12 17:37:25

+0

[它失敗的例子](http://codepad.viper-7.com/tkmI8E)。 'parse_url'對此不是很適合。 – Artefacto 2010-08-12 19:00:03

+0

@Artefact - 這不是一個失敗;這是一場勝利。你真的**想把'username'和**'password' **包含到HTML服務器中嗎?這正是'parse_url'很好的原因。順便說一句,如果你想,你**可以**包括那些當存在....只是看看可能的返回值。 – 2010-08-12 19:13:04

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

這不起作用(PARSE_URL_PATH甚至不是一個常量,如果使用了PHP_URL_PATH,它只會提供路徑部分),但不知怎的,它會得到兩次投票。 – Artefacto 2010-08-12 19:34:50

0
$url = strtok($url,"?"); 
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的基礎成分時,U可以得到查詢字符串從它的請求類如下:

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