2010-02-23 10 views
68

Làm thế nào tôi có thể nhận được mảnh (giá trị sau băm '#') từ một URL trong php?Lấy mảnh (giá trị sau băm '#') từ một URL trong php

nói từ http://domain.com/site/gallery/1#photo45 Tôi muốn photo45

+1

@ile http://en.wikipedia.org/wiki/Hash_symbol –

+1

Trùng lặp hoặc ít nhất là trên cùng một các dòng như http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php, http://stackoverflow.com/questions/1162008/php-hash-fragment-portion- of-url và http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment-from-request-object – Gordon

+1

bản sao có thể có của [Cách nhận giá trị sau băm trong "somepage.php # name"?] (http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS

Trả lời

92

Nếu bạn muốn nhận được các giá trị sau dấu băm hoặc neo như trong trình duyệt của người dùng: isn này' có thể với HTTP "chuẩn" vì giá trị này không bao giờ được gửi đến máy chủ (do đó nó sẽ không có sẵn trong $_SERVER["REQUEST_URI"] hoặc các biến được xác định trước tương tự). Bạn sẽ cần một số loại ma thuật JavaScript ở phía khách hàng, ví dụ: để bao gồm giá trị này dưới dạng tham số POST.

Nếu nó chỉ phân tích cú pháp một URL đã biết từ bất kỳ nguồn nào, thì answer by mck89 là hoàn toàn tốt.

+29

'alert (window.location.hash);' – sfussenegger

+2

chỉ là một lưu ý: 'window.location.hash' cho bạn toàn bộ phân đoạn BAO GỒM ký hiệu' # '[băm] ... và dĩ nhiên, trong JavaScript :) –

+1

BTW: JavaScript ma thuật: D: D: D: D: D ... 'var forms = document.getElementsByTagName ('form'); cho (var i = 0; i

3

Bạn không thể nhận được các văn bản sau dấu băm. Nó không được gửi đến máy chủ trong một yêu cầu.

35

Đó là một phần được gọi là "mảnh" và bạn có thể nhận được nó theo cách này:

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

Đó là rất tốt nhưng nó sẽ không có lỗi nếu bạn thêm '' '$ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragment']: ''; '' 'Nhưng vẫn Thumbs Up !! –

7

Tôi đã tìm cách giải quyết vấn đề này một chút - và điều duy nhất tôi tìm thấy là sử dụng ghi đè URL để đọc "neo". Tôi tìm thấy trong tài liệu apache tại đây http://httpd.apache.org/docs/2.2/rewrite/advanced.html những điều sau đây ...

Theo mặc định, chuyển hướng đến một neo HTML không hoạt động, vì mod_rewrite thoát ký tự #, biến nó thành% 23. Điều này, đến lượt nó, phá vỡ sự chuyển hướng.

Giải pháp: Sử dụng cờ [NE] trên RewriteRule. NE là viết tắt của No Escape.

Thảo luận: Kỹ thuật này dĩ nhiên cũng sẽ hoạt động với các ký tự đặc biệt khác mod_rewrite, theo mặc định, mã hóa URL.

Nó có thể có các cảnh báo khác và những gì không ... nhưng tôi nghĩ rằng ít nhất làm điều gì đó với # trên máy chủ là có thể.

20

A) đã có url với #hash trong PHP? Dễ dàng! Chỉ cần phân tích nó ra!

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

Hoặc trong "cũ" PHP bạn phải pre-lưu trữ các phát nổ để truy cập mảng:

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

B) Bạn muốn có được một #hash bằng cách gửi một hình thức để PHP?
        => Sử dụng một số MAGIC JavaScript!(Để pre-quá trình hình thức)

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 
}); 

Tùy thuộc vào form 's method của bạn thuộc tính bạn nhận được băm này trong PHP bởi:
$_GET['fragment'] hoặc $_POST['fragment']

lợi nhuận có thể xảy ra: 1."" [trống string] (không băm) 2. toàn bộ băm BAO GỒM # dấu [băm] (vì chúng tôi đã sử dụng window.location.hash trong JavaScript mà chỉ hoạt động theo cách đó :))

C) Bạn muốn nhận đượC#hash trong PHP JUST từ URL được yêu cầu?

                                                                        BẠN KHÔNG THỂ!

... (không trong khi xem xét các yêu cầu HTTP thông thường) ...

... Hy vọng điều này giúp :)

0

Bạn có thể làm một chuỗi thay thế trên các mặt hàng sau đó phía máy chủ. Không phải là một giải pháp đặc biệt mạnh mẽ nhưng nếu bạn không phải là một giải pháp nhanh chóng như tôi thì tôi sẽ nghĩ như vậy.

Chủ đầu tư:

Server:

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

Lấy dữ liệu sau khi hashmark trong một chuỗi truy vấn là đơn giản. Dưới đây là một ví dụ được sử dụng khi khách hàng truy cập một bảng thuật ngữ các thuật ngữ từ một cuốn sách. Nó lấy tên anchor được phân phối (#tesla) và cung cấp cho khách hàng cụm từ đó và làm nổi bật cụm từ và mô tả của nó bằng màu xanh để dễ nhìn thấy.

A. thiết lập chuỗi của bạn với một div id, vì vậy tên neo đi đâu phải của nó đến và javascript có thể thay đổi màu sắc văn bản

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

B. Sử dụng Javascript để thực hiện công việc nặng nhọc, trên phía máy chủ, được chèn vào trang PHP của bạn hoặc bất cứ nơi nào ..

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

C. Tôi tự động khởi chạy hàm java khi tải trang.

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

D.được neo (#tesla) từ url nhận bởi máy chủ

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

E. cắt dấu băm tắt của nó

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

F. Tôi cần phải làm nổi bật những hạn và mô tả vì vậy tôi tạo ra một var mới

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

G. Bây giờ tôi có thể thao tác màu sắc văn bản trong thời hạn và mô tả

var elem = document.getElementById(myhash1); 
elem.style.color = 'blue'; 
elem = document.getElementById(myhash2); 
elem.style.color = 'blue'; 
}); 
</script> 

H. Tính năng này hoạt động. khách hàng nhấp vào liên kết trên phía khách hàng (xyz.com # tesla) và đi ngay đến thuật ngữ. thuật ngữ và mô tả được đánh dấu bằng màu xanh dương bằng javascript để đọc nhanh .. tất cả các mục còn lại đều có màu đen ..

+1

Câu trả lời này chỉ xử lý việc xử lý phía máy khách của đoạn, trong khi câu hỏi là về phía máy chủ (với PHP). –

+0

với thiết lập phía khách hàng đúng cách, sau đó phía máy chủ dễ dàng với PHP. –