2010-02-23 45 views
68

如何從PHP中的URL獲得片段(哈希「#」後的值)?獲取片段(哈希值「#」後)從PHP中的URL

說從http://domain.com/site/gallery/1#photo45我想photo45

+1

@ile http://en.wikipedia.org/wiki/Hash_symbol – 2010-02-23 11:20:07

+1

重複或至少在相同行作爲http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php,http://stackoverflow.com/questions/1162008/php-hash-fragment-portion-網址和http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment-from-request-object – Gordon 2010-02-23 12:09:58

+1

可能的重複[如何獲得值後「somepage.php#name」中的散列?](http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS 2015-07-08 09:39:48

回答

92

如果你想獲得哈希標記或錨後的值顯示在用戶的瀏覽器:這ISN」 t「標準」HTTP的可能性,因爲此值永遠不會發送到服務器(因此它不會在$_SERVER["REQUEST_URI"]或類似的預定義變量中可用)。您需要在客戶端使用某種JavaScript魔術,例如將此值作爲POST參數包含在內。

如果只有來自任何來源解析一個已知的URL,該answer by mck89是完全正常的,但。

+29

'alert(window.location.hash);' – sfussenegger 2010-02-23 11:15:38

+2

只是一個說明:'window.location.hash'可以讓你得到整個片段,包括'#'[hash]符號......當然,它在JavaScript中:) – 2014-12-09 01:07:30

+1

BTW:JavaScript magic:D:D:D:D:D ... var forms = document.getElementsByTagName('form'); for(var i = 0; i

3

你不能得到哈希標記後的文本。它不會在請求中發送到服務器。

35

這部分被稱爲「片段」,你可以用這種方式得到它:

$url=parse_url("http://domain.com/site/gallery/1#photo45 "); 
echo $url["fragment"]; //This variable contains the fragment 
+0

這就是非常好,但如果你要添加'''$ fragment = isset($ url ['fragment']),那麼它將沒有任何錯誤? '#'。 $ url ['fragment']:''; '''但仍然豎起大拇指! – 2016-12-19 15:45:57

7

我一直在尋找這方面的解決方法 - 我發現的唯一的事情就是使用URL重寫來讀取「錨點」。我在Apache文檔發現這裏http://httpd.apache.org/docs/2.2/rewrite/advanced.html以下...

默認情況下,重定向到一個HTML錨不起作用,因爲mod_rewrite的轉義字符#,把它變成23%。 這反過來打破了重定向。

解決方案:使用[NE]標誌的重寫規則。 NE代表No Escape。

討論:這項技術當然也有其他特殊 字符mod_rewrite的,默認情況下,URL編碼工作。

它可能有其他的注意事項,什麼不可以...但我認爲,至少做一些與服務器上的#是可能的。

20

A)PHP中已經有#hash的url了嗎?簡單!解析它!

if(strpos($url, "#") === false) echo "NO HASH !"; 
    else echo "HASH IS: #".explode("#", $url)[1]; // arrays are indexed from 0 

還是以「老」 PHP您必須預先儲存爆炸訪問數組:

$exploded_url = explode("#", $url); $exploded_url[1]; 

B)您想發送的形式PHP獲得#hash?
        =>使用一些JavaScript神奇!(預先處理的形式)

var forms = document.getElementsByTagName('form'); //get all forms on the site 
for(var i=0; i<forms.length;i++) forms[i].addEventListener('submit', //to each form... 
function(){ //add a submit pre-processing function that will: 
    var hidden = document.createElement("input"); //create an extra input element 
    hidden.setAttribute('type','hidden'); //set it to hidden so it doesn't break view 
    hidden.setAttribute('name','fragment'); //set a name to get by it in PHP 
    hidden.setAttribute('value',window.location.hash); //set a value of #HASH 
    this.appendChild(hidden); //append it to the current form 
}); 

根據您的formmethod屬性您得到這個哈希在PHP中:
$_GET['fragment']$_POST['fragment']

可能的回報: 1. "" [空字符串](無散列)2.整個散列包括# [散列]符號(因爲我們已經在JavaScript中使用window.location.hash,它只是以這種方式工作:))

C)你想從請求的URL中獲得PHP JUST的#hash?

                                                                       你不能!

...(不同時考慮常規的HTTP請求)...

...希望這有助於:)

0

你可以做一個字符串在客戶端,然後在服務器端進行更換。不是一個特別強大的解決方案,但如果你不想像我這樣的快速解決方案,我認爲就足夠了。

客戶:

服務器:

$user_message = $_GET['userMessage']; 
$user_message = str_replace("hashtag", "#", $user_message); 
-3

獲取數據的查詢字符串hashmark之後是簡單的。以下是當客戶訪問書中術語詞彙表時使用的示例。它需要名稱錨點(#tesla),並將客戶端傳送到該術語,並用藍色突出顯示該術語及其描述,以便於查看。

A.設置你的琴絃用DIV ID,所以這個名字錨飛到哪裏,它應該和JavaScript可以改變文本顏色

<div id="tesla">Tesla</div> 
<div id="tesla1">An energy company</div> 

B.使用JavaScript來完成繁重的工作,在服務器端,插在你的PHP頁面,或任何..

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 

C.我會自動啓動Java功能加載頁面時。

<script> 
$(document).ready(function() { 

D.獲得從服務器

var myhash1 = $(location).attr('hash'); //myhash1 == #tesla 

E.接收到的URL的錨點(#tesla)修剪井號關閉它

myhash1 = myhash1.substr(1) //myhash1 == tesla 

F.我需要強調的術語和說明,所以我創建一個新的變種

var myhash2 = '1'; 
myhash2 = myhash1.concat(myhash2); //myhash2 == tesla1 

G.現在我可以操縱的術語和描述

文字顏色

H. This works。客戶端點擊客戶端的鏈接(xyz.com#tesla),並直接進入該術語。該術語和說明用藍色突出顯示,以便快速閱讀..所有其他條目留在黑色..

+1

這個答案僅處理片段的客戶端處理,而問題是關於服務器端(使用PHP)。 – 2017-04-12 10:00:06

+0

與客戶端安裝正確,然後服務器端很容易與PHP。 – 2017-04-14 17:36:01