ฉันจะเลือกส่วนหลังสัญลักษณ์ '#' ใน URL ของฉันโดยใช้ PHP ได้อย่างไร
ผลลัพธ์ที่ฉันต้องการคือ "photo45"
นี่คือตัวอย่าง URL:
http://example.com/site/gallery/1#photo45
ฉันจะเลือกส่วนหลังสัญลักษณ์ '#' ใน URL ของฉันโดยใช้ PHP ได้อย่างไร
ผลลัพธ์ที่ฉันต้องการคือ "photo45"
นี่คือตัวอย่าง URL:
http://example.com/site/gallery/1#photo45
คำตอบ:
หากคุณต้องการรับค่าหลังเครื่องหมายแฮชหรือจุดยึดตามที่แสดงในเบราว์เซอร์ของผู้ใช้: ไม่สามารถทำได้กับ HTTP "มาตรฐาน" เนื่องจากค่านี้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ (ดังนั้นจึงไม่สามารถใช้ได้ใน$_SERVER["REQUEST_URI"]
หรือคล้ายกัน ตัวแปรที่กำหนดไว้ล่วงหน้า) คุณจะต้องใช้เวทย์มนตร์ JavaScript ในฝั่งไคลเอนต์เช่นรวมค่านี้เป็นพารามิเตอร์ POST
หากเป็นเพียงการแยกวิเคราะห์ URL ที่รู้จักจากแหล่งใดก็ตามคำตอบของ mck89นั้นดีมาก
alert(window.location.hash);
window.location.hash
ทำให้คุณได้รับส่วนทั้งหมดรวมถึงเครื่องหมาย#
[แฮช] ... และแน่นอนใน JavaScript :)
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!
ส่วนนั้นเรียกว่า "ส่วน" และคุณสามารถรับได้ด้วยวิธีนี้:
$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
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];
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 ซึ่งก็ใช้ได้ดี :))
... (ไม่ใช่ในขณะที่พิจารณาคำขอ HTTP ปกติ) ...
... หวังว่านี่จะช่วยได้ :)
ฉันได้ค้นหาวิธีแก้ปัญหานี้มานานแล้วและสิ่งเดียวที่ฉันพบคือใช้การเขียน URL ใหม่เพื่ออ่าน "จุดยึด" ฉันพบในเอกสาร apache ที่นี่http://httpd.apache.org/docs/2.2/rewrite/advanced.htmlต่อไปนี้ ...
โดยค่าเริ่มต้นการเปลี่ยนเส้นทางไปยังจุดยึด HTML จะไม่ทำงานเนื่องจาก mod_rewrite จะหลีกเลี่ยงอักขระ # โดยเปลี่ยนเป็น% 23 สิ่งนี้จะทำลายการเปลี่ยนเส้นทาง
วิธีแก้ไข: ใช้แฟล็ก [NE] บน RewriteRule NE ย่อมาจาก No Escape
การอภิปราย: แน่นอนว่าเทคนิคนี้จะใช้ได้กับอักขระพิเศษอื่น ๆ ที่ mod_rewrite โดยค่าเริ่มต้นจะเข้ารหัส URL
มันอาจมีข้อแม้อื่น ๆ และสิ่งที่ไม่ ... แต่ฉันคิดว่าอย่างน้อยการทำอะไรบางอย่างกับ # บนเซิร์ฟเวอร์ก็เป็นไปได้
คุณไม่สามารถรับข้อความหลังจากที่เครื่องหมาย จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ในคำขอ
ฉันพบเคล็ดลับนี้หากคุณยืนยันว่าต้องการค่าด้วย PHP แยกค่า anchor ( #
) และรับด้วย JavaScript จากนั้นเก็บเป็นคุกกี้หลังจากนั้นรับค่าคุกกี้ด้วย PHP
คุณสามารถทำได้โดยใช้จาวาสคริปต์และ 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'] (ตั้งค่าแบบฟอร์ม)
หากคุณต้องการดึงแฮชจาก 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;
?>
คุณต้องแยกวิเคราะห์ 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'
$_SERVER['REQUEST_URI']
ไม่ได้รวมถึง #fragment
การรับข้อมูลหลังแฮชมาร์กในสตริงแบบสอบถามนั้นง่ายมาก นี่คือตัวอย่างที่ใช้เมื่อลูกค้าเข้าถึงอภิธานศัพท์จากหนังสือ ใช้จุดยึดชื่อที่ส่ง (#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) และไปที่คำดังกล่าว คำและคำอธิบายจะเน้นด้วยสีน้ำเงินโดยจาวาสคริปต์เพื่อการอ่านอย่างรวดเร็ว .. รายการอื่น ๆ ทั้งหมดจะเป็นสีดำ ..