รับส่วนย่อย (ค่าหลังแฮช '#') จาก URL ใน php [ปิด]


107

ฉันจะเลือกส่วนหลังสัญลักษณ์ '#' ใน URL ของฉันโดยใช้ PHP ได้อย่างไร
ผลลัพธ์ที่ฉันต้องการคือ "photo45"

นี่คือตัวอย่าง URL:
http://example.com/site/gallery/1#photo45



2
ทำซ้ำหรืออย่างน้อยก็อยู่ในบรรทัดเดียวกับstackoverflow.com/questions/1957030/… , stackoverflow.com/questions/1162008/…และstackoverflow.com/questions/2181290/…
Gordon

2
เป็นไปได้ที่ซ้ำกันของวิธีรับค่าหลังจากแฮชใน "somepage.php # name"?
PhoneixS

1
PHP ไม่สามารถรับ URL ที่สมบูรณ์รวมถึงชื่อจุดยึด เนื่องจากสิ่งที่ JavaScript และ DOM สามารถจัดการได้อาจจำเป็นต้องได้รับการประมวลผลโดย PHP จึงไม่สมเหตุสมผลที่ PHP จะไม่สามารถรับ URL ทั้งหมดที่เรียกว่า ดูเหมือนจะเป็นข้อผิดพลาดที่ใหญ่มากใน PHP เว้นแต่ฉันจะพลาดอะไรไป
David Spector

คำตอบ:


121

หากคุณต้องการรับค่าหลังเครื่องหมายแฮชหรือจุดยึดตามที่แสดงในเบราว์เซอร์ของผู้ใช้: ไม่สามารถทำได้กับ HTTP "มาตรฐาน" เนื่องจากค่านี้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ (ดังนั้นจึงไม่สามารถใช้ได้ใน$_SERVER["REQUEST_URI"]หรือคล้ายกัน ตัวแปรที่กำหนดไว้ล่วงหน้า) คุณจะต้องใช้เวทย์มนตร์ JavaScript ในฝั่งไคลเอนต์เช่นรวมค่านี้เป็นพารามิเตอร์ POST

หากเป็นเพียงการแยกวิเคราะห์ URL ที่รู้จักจากแหล่งใดก็ตามคำตอบของ mck89นั้นดีมาก


40
alert(window.location.hash);
sfussenegger

5
หมายเหตุ: window.location.hashทำให้คุณได้รับส่วนทั้งหมดรวมถึงเครื่องหมาย#[แฮช] ... และแน่นอนใน JavaScript :)
jave.web

2
BTW: ความมหัศจรรย์ของ 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); });... ขึ้นอยู่กับ "วิธีการ" ของแบบฟอร์มคุณจะได้รับแฮชโดย$_POST['fragment']หรือ$_GET['fragment'].... MAGIC!
jave.web

ค่าหลังแฮชมาร์กสามารถรับได้จากฝั่งเซิร์ฟเวอร์ ฉันแสดงวิธีแก้ปัญหาด้านล่าง
JamesAD-0

ส่วนหนึ่งของคำตอบของคุณไม่ถูกต้องอีกต่อไปใน Chrome chromestatus.com/feature/4753419730419712และ Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178ทั้งคู่ส่งสิ่งนี้ไปยังเซิร์ฟเวอร์
Jeff Puckett

41

ส่วนนั้นเรียกว่า "ส่วน" และคุณสามารถรับได้ด้วยวิธีนี้:

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

นั่นเป็นสิ่งที่ดีมาก แต่จะไม่มีข้อผิดพลาดใด ๆ หากคุณเพิ่ม `` $ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragment']: ''; `` แต่ยังยกนิ้วให้ !!
John Max

11
สิ่งนี้ใช้ได้กับ url ที่บันทึกไว้ในสตริงไม่ใช่ url จริงจากแถบที่อยู่ของเบราว์เซอร์
Muhammad Omer Aslam

2
นี่เป็นความจริง แต่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามเดิม ผู้ถามไม่มีสตริง URL แบบเต็ม
Derek Joseph Olson

2
ผู้ถามไม่ได้เจาะจงบอกว่าเขาไม่ได้ระบุ URL อย่างตรงไปตรงมาหรือต้องการส่วนย่อยจาก URL ที่แสดงอยู่ในแถบที่อยู่ของเบราว์เซอร์ เขาถามวิธีการแยก fragement จากURL ดังนั้นถ้าเขาแก้ไขคำถามของเขาคำตอบนี้ควรปรับพอ
DrLightman

1
จริงๆแล้วคุณจะได้รับชิ้นส่วนในบรรทัดเดียว:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

ก) มี url พร้อม #hash ใน PHP แล้วหรือยัง ง่าย! แค่แยกวิเคราะห์!

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 หรือไม่?
    => ใช้ JavaScript MAGIC! (เพื่อประมวลผลแบบฟอร์มล่วงหน้า)

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

ทั้งนี้ขึ้นอยู่กับคุณform's methodแอตทริบิวต์ที่คุณได้รับกัญชานี้ใน PHP โดย:
$_GET['fragment']หรือ$_POST['fragment']

ผลตอบแทนที่เป็นไปได้: 1. ""[สตริงว่าง] (ไม่มีแฮช) 2. แฮชทั้งหมดที่มีเครื่องหมาย#[แฮช] (เพราะเราใช้window.location.hashใน JavaScript ซึ่งก็ใช้ได้ดี :))

C) คุณต้องการรับ #hash ใน PHP เพียงจาก URL ที่ร้องขอหรือไม่?

                                    คุณทำไม่ได้!

... (ไม่ใช่ในขณะที่พิจารณาคำขอ HTTP ปกติ) ...

... หวังว่านี่จะช่วยได้ :)


9

ฉันได้ค้นหาวิธีแก้ปัญหานี้มานานแล้วและสิ่งเดียวที่ฉันพบคือใช้การเขียน URL ใหม่เพื่ออ่าน "จุดยึด" ฉันพบในเอกสาร apache ที่นี่http://httpd.apache.org/docs/2.2/rewrite/advanced.htmlต่อไปนี้ ...

โดยค่าเริ่มต้นการเปลี่ยนเส้นทางไปยังจุดยึด HTML จะไม่ทำงานเนื่องจาก mod_rewrite จะหลีกเลี่ยงอักขระ # โดยเปลี่ยนเป็น% 23 สิ่งนี้จะทำลายการเปลี่ยนเส้นทาง

วิธีแก้ไข: ใช้แฟล็ก [NE] บน RewriteRule NE ย่อมาจาก No Escape

การอภิปราย: แน่นอนว่าเทคนิคนี้จะใช้ได้กับอักขระพิเศษอื่น ๆ ที่ mod_rewrite โดยค่าเริ่มต้นจะเข้ารหัส URL

มันอาจมีข้อแม้อื่น ๆ และสิ่งที่ไม่ ... แต่ฉันคิดว่าอย่างน้อยการทำอะไรบางอย่างกับ # บนเซิร์ฟเวอร์ก็เป็นไปได้


1
คุณทดสอบสิ่งนี้หรือไม่? ได้ผลหรือไม่? คนอื่น ๆ บอกว่าจะไม่มีการส่งชื่อผู้ประกาศในคำขอ
David Spector

6

คุณไม่สามารถรับข้อความหลังจากที่เครื่องหมาย จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ในคำขอ


แต่เราสามารถรับค่า after # โดยใช้ jquery
Shakir Blouch

1
คำตอบนี้ไม่ถูกต้องอีกต่อไปใน Chrome chromestatus.com/feature/4753419730419712และ Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178
Jeff Puckett

3

ฉันพบเคล็ดลับนี้หากคุณยืนยันว่าต้องการค่าด้วย PHP แยกค่า anchor ( #) และรับด้วย JavaScript จากนั้นเก็บเป็นคุกกี้หลังจากนั้นรับค่าคุกกี้ด้วย PHP


ดี แต่ใช้งานได้เฉพาะในเบราว์เซอร์ที่มีคุกกี้ ไม่ทำงานเช่นโดยการร้องขอ curl
Marcin Jaworski

0

คุณสามารถทำได้โดยใช้จาวาสคริปต์และ php ร่วมกัน:

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

และอีกด้านหนึ่ง;

<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>

จากนั้นในการส่งแบบฟอร์มคุณสามารถดึงค่าผ่าน $ _POST ['hash'] (ตั้งค่าแบบฟอร์ม)


ไม่ตอบคำถาม
David Spector

0

หากคุณต้องการดึงแฮชจาก URL แบบไดนามิกสิ่งนี้ควรใช้งานได้: 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;
?>

และคุณจะรัน JavaScript จากภายในสคริปต์ PHP โดยไม่ต้องร้องขอเพิ่มเติมได้อย่างไร?
David Spector

-1

คุณต้องแยกวิเคราะห์ url ก่อนจึงจะเป็นดังนี้:

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

หากคุณต้องการแยกวิเคราะห์ url จริงของเบราว์เซอร์ปัจจุบันคุณต้องขอโทรไปที่เซิร์ฟเวอร์

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

5
บนเซิร์ฟเวอร์ของฉันกับ Apache 2.4.35 / PHP 7.0.26 ตัวแปร$_SERVER['REQUEST_URI']ไม่ได้รวมถึง #fragment
user9645

-5

การรับข้อมูลหลังแฮชมาร์กในสตริงแบบสอบถามนั้นง่ายมาก นี่คือตัวอย่างที่ใช้เมื่อลูกค้าเข้าถึงอภิธานศัพท์จากหนังสือ ใช้จุดยึดชื่อที่ส่ง (#tesla) และส่งลูกค้าไปยังคำนั้นและเน้นคำและคำอธิบายเป็นสีน้ำเงินเพื่อให้มองเห็นได้ง่าย

A. ตั้งค่าสตริงของคุณด้วยรหัส div ดังนั้นจุดยึดชื่อจึงไปในที่ที่ควรจะเป็นและจาวาสคริปต์สามารถเปลี่ยนสีข้อความได้

<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. รับจุดยึด (#tesla) จาก url ที่เซิร์ฟเวอร์ได้รับ

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

E. ตัดเครื่องหมายแฮชออก

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

F. ฉันต้องการเน้นคำและคำอธิบายดังนั้นฉันจึงสร้างตัวแปรใหม่

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

G. ตอนนี้ฉันสามารถปรับแต่งสีข้อความสำหรับคำศัพท์และคำอธิบายได้

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

H. นี้ได้ผล ลูกค้าคลิกลิงก์ที่ฝั่งไคลเอ็นต์ (xyz.com # tesla) และไปที่คำดังกล่าว คำและคำอธิบายจะเน้นด้วยสีน้ำเงินโดยจาวาสคริปต์เพื่อการอ่านอย่างรวดเร็ว .. รายการอื่น ๆ ทั้งหมดจะเป็นสีดำ ..


3
คำตอบนี้เกี่ยวข้องกับการจัดการแฟรกเมนต์ฝั่งไคลเอ็นต์เท่านั้นในขณะที่คำถามเกี่ยวกับฝั่งเซิร์ฟเวอร์ (พร้อม PHP)
Martijn Heemels

ด้วยการตั้งค่าฝั่งไคลเอ็นต์อย่างถูกต้องจากนั้นฝั่งเซิร์ฟเวอร์ก็ทำได้ง่ายด้วย PHP
JamesAD-0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.