Nhận phân đoạn (giá trị sau băm '#') từ một URL trong php [đã đóng]


107

Làm cách nào để tôi có thể chọn phân đoạn sau ký hiệu '#' trong URL của mình bằng PHP?
Kết quả mà tôi muốn là "photo45".

Đây là một URL mẫu:
http://example.com/site/gallery/1#photo45





1
PHP không thể có được một URL hoàn chỉnh, bao gồm cả tên liên kết. Vì bất kỳ thứ gì JavaScript và DOM có thể thao tác đều cần được PHP xử lý, nên không có nghĩa là PHP không thể lấy toàn bộ URL mà nó được gọi. Có vẻ là một lỗi rất lớn trong PHP, trừ khi tôi thiếu thứ gì đó.
David Spector

Câu trả lời:


120

Nếu bạn muốn nhận giá trị sau dấu thăng hoặc ký tự liên kết như được hiển thị trong trình duyệt của người dùng: Điều này không thể xảy ra 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 tương tự biến xác định trước). Bạn sẽ cần một số loại phép thuật JavaScript ở phía máy khách, ví dụ: để bao gồm giá trị này dưới dạng tham số POST.

Nếu chỉ về phân tích cú pháp một URL đã biết từ bất kỳ nguồn nào thì câu trả lời của mck89 là hoàn toàn ổn.


40
alert(window.location.hash);
sfussenegger

5
chỉ là một lưu ý: window.location.hashgiúp bạn toàn bộ đoạn BAO GỒM các #[băm] dấu ... và nó là, tất nhiên, trong JavaScript :)
jave.web

2
BTW: Phép thuật JavaScript: D: D: D: D: D ... var forms = document.getElementsByTagName('form'); for(var i=0; i<forms.length;i++) forms[i].addEventListener('submit',function(){ var hidden = document.createElement("input"); hidden.setAttribute('type','hidden'); hidden.setAttribute('name','fragment'); hidden.setAttribute('value',window.location.hash); this.appendChild(hidden); });... tùy thuộc vào "phương thức" của biểu mẫu mà bạn nhận được hàm băm bằng $_POST['fragment']hoặc $_GET['fragment'].... MAGIC!
jave.web

giá trị sau dấu thăng có thể được nhận từ phía máy chủ. Tôi hiển thị một giải pháp dưới đây.
JamesAD-0

một phần của câu trả lời là không còn đúng trong Chrome chromestatus.com/feature/4753419730419712 và Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 cả làm gửi thông điệp này đến máy chủ
Jeff Puckett

41

Phần đó được gọi là "phân mảnh" và bạn có thể lấy nó theo cách này:

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

Điều đó rất tốt nhưng sẽ không có bất kỳ lỗi nào nếu bạn thêm `` $ segment = Isset ($ url ['segment'])? '#'. $ url ['mảnh']: ''; `` Nhưng vẫn thích !!
John Max

11
công trình này cho một url lưu bên trong một chuỗi không phải là url thực tế từ thanh địa chỉ trình duyệt
Muhammad Aslam Omer

2
Điều này đúng nhưng không phải là câu trả lời chính xác cho câu hỏi ban đầu. Người hỏi không có chuỗi URL đầy đủ.
Derek Joseph Olson

2
Người hỏi không cụ thể nói rằng anh ta không có URL trung thực hoặc anh ta cần phân đoạn từ URL hiện đang hiển thị trong thanh địa chỉ của trình duyệt. Anh ấy hỏi làm thế nào để phân tích cú pháp phân đoạn từ một URL, vì vậy trừ khi anh ấy chỉnh sửa câu hỏi của mình, câu trả lời này sẽ đủ tốt.
DrLightman

1
Trên thực tế bạn có thể lấy mảnh trong một dòng:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

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 PHP "cũ", bạn phải lưu trữ trước phần mềm đã phát nổ để truy cập vào mảng:

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

B) Bạn muốn nhận #hash bằng cách gửi một biểu mẫu tới PHP?
    => Sử dụng một số MAGIC JavaScript! (Để xử lý trước biểu mẫu)

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 bạn form's methodthuộc tính bạn nhận được băm này trong PHP bởi:
$_GET['fragment']hoặc$_POST['fragment']

Khả năng trả về: 1. ""[chuỗi trống] (không có 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.hashtrong JavaScript mà chỉ hoạt động theo cách đó :))

C) Bạn muốn lấy #hash trong PHP CHỈ từ URL được yêu cầu?

                                    BẠN KHÔNG THỂ!

... (không phải 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 :)


9

Tôi đã tìm kiếm giải pháp thay thế cho 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 lại URL để đọc "neo". Tôi tìm thấy tài liệu apache tại đây http://httpd.apache.org/docs/2.2/rewrite/advanced.html sau đây ...

Theo mặc định, chuyển hướng đến một liên kết HTML không hoạt động vì mod_rewrite thoát khỏi 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.

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

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


1
Bạn đã kiểm tra điều này? Nó có hoạt động không? Những người khác đang nói rằng tên neo không bao giờ được gửi trong yêu cầu.
David Spector


3

Tôi đã tìm thấy mẹo này nếu bạn muốn giá trị với PHP. tách #giá trị anchor ( ) và lấy nó bằng JavaScript, sau đó lưu trữ dưới dạng cookie, sau đó lấy giá trị cookie bằng PHP


Tốt, nhưng chỉ hoạt động trong trình duyệt với cookie. Chẳng hạn như không hoạt động theo yêu cầu curl.
Marcin Jaworski

0

Bạn có thể làm điều đó bằng sự kết hợp của javascript và php:

<div id="cont"></div>

Và bên kia;

<script>
var h = window.location.hash;
var h1 = (win.substr(1));//string with no #
var q1 = '<input type="text" id="hash" name="hash" value="'+h1+'">';

setInterval(function(){
if(win1!="")
{
document.querySelector('#cont').innerHTML = q1;
} else alert("Something went wrong")
},1000);
</script>

Sau đó, khi gửi biểu mẫu, bạn có thể lấy giá trị qua $ _POST ['hash'] (đặt biểu mẫu)


Không trả lời câu hỏi.
David Spector

0

Nếu bạn muốn tự động lấy mã băm từ URL, điều này sẽ hoạt động: https://stackoverflow.com/a/57368072/2062851

<script>
var hash = window.location.hash, //get the hash from url
    cleanhash = hash.replace("#", ""); //remove the #
    //alert(cleanhash);
</script>

<?php
$hash = "<script>document.writeln(cleanhash);</script>";
echo $hash;
?>

Và làm thế nào để bạn thực thi JavaScript từ bên trong một tập lệnh PHP mà không cần thêm yêu cầu?
David Spector

-1

Bạn cần phải phân tích cú pháp url trước, vì vậy nó sẽ như thế này:

$url = "https://www.example.com/profile#picture";
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

Nếu bạn cần phân tích cú pháp url thực của trình duyệt hiện tại, bạn cần yêu cầu gọi máy chủ.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

5
Trên máy chủ của tôi với apache 2.4.35 / 7.0.26 PHP biến $_SERVER['REQUEST_URI']không không bao gồm các #fragment
user9645

-5

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

A. thiết lập các chuỗi của bạn với một id div, vì vậy ký tự liên kết tên sẽ đi đúng chỗ và javascript có thể thay đổi màu 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, ở 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 đang khởi chạy chức năng java tự động khi trang được tải.

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

D. lấy neo (#tesla) từ url mà máy chủ nhận được

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

E. cắt bớt dấu thăng của nó

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

F. Tôi cần đánh dấu thuật ngữ và mô tả để tạo một var mới

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

G. Bây giờ tôi có thể điều chỉnh màu văn bản cho thuật ngữ và mô tả

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

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


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

với thiết lập phía máy khách đúng cách, thì phía máy chủ sẽ dễ dàng với PHP.
JamesAD-0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.