फ़्रेप [बंद] में एक यूआरएल से टुकड़ा (हैश '#' के बाद मूल्य) प्राप्त करें


107

मैं PHP का उपयोग करके अपने URL में '#' प्रतीक के बाद के टुकड़े का चयन कैसे कर सकता हूं?
परिणाम जो मुझे चाहिए "फोटो 45" है।

यह एक उदाहरण URL है:
http://example.com/site/gallery/1#photo45



2
के रूप में उसी तर्ज पर डुप्लीकेट या कम से कम stackoverflow.com/questions/1957030/... , stackoverflow.com/questions/1162008/... और stackoverflow.com/questions/2181290/...
गॉर्डन


1
PHP एंकर नाम सहित पूरा URL प्राप्त नहीं कर सकती है। चूंकि जावास्क्रिप्ट और डोम कुछ भी हेरफेर कर सकते हैं, उन्हें PHP द्वारा संसाधित करने की आवश्यकता हो सकती है, यह समझ में नहीं आता है कि PHP पूरे URL को प्राप्त नहीं कर सकता है जिसके साथ इसे कहा जाता है। PHP में एक बहुत बड़ा बग लगता है, जब तक मैं कुछ याद कर रहा हूँ।
डेविड स्पेक्टर

जवाबों:


120

यदि आप उपयोगकर्ता के ब्राउज़र में दिखाए गए हैश मार्क या एंकर के बाद मान प्राप्त करना चाहते हैं: यह "मानक" HTTP के साथ संभव नहीं है क्योंकि यह मान सर्वर पर कभी नहीं भेजा जाता है (इसलिए यह $_SERVER["REQUEST_URI"]या इसी तरह उपलब्ध नहीं होगा। पूर्वनिर्धारित चर)। क्लाइंट मान पर आपको कुछ प्रकार के जावास्क्रिप्ट जादू की आवश्यकता होगी, जैसे कि इस मूल्य को एक POST पैरामीटर के रूप में शामिल करना।

यदि यह केवल किसी भी स्रोत से किसी ज्ञात URL को पार्स करने के बारे में है, तो mck89 द्वारा उत्तर हालांकि पूरी तरह से ठीक है।


40
alert(window.location.hash);
sfussenegger

5
बस एक नोट: window.location.hashआप #[हैश] साइन
इनचार्ज

2
BTW: जावास्क्रिप्ट जादू: 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

हैशमार्क के बाद का मूल्य सर्वर की ओर से प्राप्त किया जा सकता है। मैं नीचे एक समाधान दिखाता हूं।
जेम्सएडी-०

Chrome Chromestatus.com/feature/4753419730419712 और Firefox Bugzilla.mozilla.org/show_bug.cgi?id=1264178 पर आपके उत्तर का हिस्सा अब सही नहीं है, दोनों सर्वर पर इसे भेजते हैं
जेफ पकेट

41

उस हिस्से को "टुकड़ा" कहा जाता है और आप इसे इस तरह से प्राप्त कर सकते हैं:

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

यह बहुत अच्छा है, लेकिन अगर आप `` $ टुकड़ा = isset ($ url ['टुकड़ा']) को जोड़ने के लिए किसी भी त्रुटि के बिना होता है? '#'। $ url ['टुकड़ा']: ''; `` `लेकिन फिर भी अंगूठे ऊपर !!
जॉन मैक्स

11
यह एक स्ट्रिंग के अंदर सहेजे गए url के लिए काम करता है जो ब्राउज़र एड्रेस बार से वास्तविक url नहीं है
मुहम्मद ओमर असलम

2
यह सही है लेकिन मूल प्रश्न का सही उत्तर नहीं है। पूछने वाले के पास पूरा URL स्ट्रिंग नहीं है।
डेरेक जोसेफ ओल्सन

2
पूछने वाले ने विशिष्ट रूप से यह नहीं कहा कि उनके पास ईमानदार होने के लिए URL नहीं था या उन्हें वर्तमान में ब्राउज़र के एड्रेस बार में प्रदर्शित URL से टुकड़े की आवश्यकता थी। उन्होंने पूछा कि एक यूआरएल से घर्षण को कैसे पार किया जाए, इसलिए जब तक उन्होंने अपने प्रश्न को संपादित नहीं किया, तब तक यह उत्तर पर्याप्त होना चाहिए।
DrLightman

1
वास्तव में आप एक पंक्ति में अंश प्राप्त कर सकते हैं:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

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 में एक फॉर्म भेजकर एक # राशि प्राप्त करना चाहते हैं?
    => कुछ जावास्क्रिप्ट जादू का प्रयोग करें! (फॉर्म को पूर्व-संसाधित करने के लिए)

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की methodविशेषता द्वारा PHP में इस हैश मिलती है:
$_GET['fragment']या$_POST['fragment']

संभावित रिटर्न: 1. ""[खाली स्ट्रिंग] (कोई हैश नहीं) 2. पूरे हैश को #[हैश] साइन (क्योंकि हमने window.location.hashजावास्क्रिप्ट में इस्तेमाल किया है जो इस तरह से काम करता है :))

ग) आप अनुरोधित URL से PHP JUST में #hash प्राप्त करना चाहते हैं ?

                                    आप नहीं कर सकते!

... (नियमित HTTP अनुरोधों पर विचार करते समय नहीं) ...

... आशा है कि यह मदद की :)


9

मैं इसके लिए एक बिट के लिए वर्कअराउंड खोज रहा हूं - और केवल एक चीज जो मुझे मिली है वह है "एंकर" पढ़ने के लिए URL रीराइट्स का उपयोग करना। मुझे यहाँ अपाचे डॉक्स में http://httpd.apache.org/docs/2.2/rewrite/advanced.html निम्नलिखित मिला ...

डिफ़ॉल्ट रूप से, HTML एंकर के लिए पुनर्निर्देशन काम नहीं करता है, क्योंकि mod_rewrite # वर्ण से बच जाता है, इसे% 23 में बदल देता है। यह, बदले में, पुनर्निर्देशन को तोड़ता है।

समाधान: रिवेराइट पर [NE] ध्वज का उपयोग करें। NE नो एस्केप के लिए खड़ा है।

चर्चा: यह तकनीक निश्चित रूप से अन्य विशेष वर्णों के साथ भी काम करेगी जो mod_rewrite, डिफ़ॉल्ट रूप से, URL- एन्कोड करते हैं।

इसके अन्य कारण हो सकते हैं और क्या नहीं ... लेकिन मुझे लगता है कि सर्वर पर # के साथ कम से कम कुछ करना संभव है।


1
क्या आपने यह परीक्षण किया? क्या यह काम करता है? अन्य लोग कह रहे हैं कि लंगर का नाम अनुरोध में नहीं भेजा गया है।
डेविड स्पेक्टर

6

आपको हैश मार्क के बाद टेक्स्ट नहीं मिल सकता है । यह अनुरोध में सर्वर को नहीं भेजा जाता है।


लेकिन हम jquery के उपयोग के बाद # मूल्य प्राप्त कर सकते हैं
शाकिर ब्लौच


3

मुझे यह तरकीब तब लगी जब आप आग्रह करते हैं कि PHP के साथ मान चाहिए। लंगर ( #) मूल्य को विभाजित करें और इसे जावास्क्रिप्ट के साथ प्राप्त करें, फिर कुकी के रूप में संग्रहीत करें, उसके बाद PHP के साथ कुकी मूल्य प्राप्त करें


अच्छा है, लेकिन कुकी के साथ केवल ब्राउज़र में काम करना। उदाहरण के लिए कर्ल अनुरोध द्वारा काम नहीं करना।
मार्सिन जोर्स्की

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 ['हैश'] के माध्यम से मान प्राप्त कर सकते हैं (फॉर्म सेट करें)


सवाल का जवाब नहीं देता।
डेविड स्पेक्टर

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

और बस आप अतिरिक्त अनुरोध के बिना एक PHP स्क्रिप्ट के अंदर से जावास्क्रिप्ट को कैसे निष्पादित करते हैं?
डेविड स्पेक्टर

-1

आपको पहले url को पार्स करने की आवश्यकता है, इसलिए यह इस प्रकार है:

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

यदि आपको वर्तमान ब्राउज़र के वास्तविक यूआरएल को पार्स करने की आवश्यकता है, तो आपको सर्वर को कॉल करने के लिए अनुरोध करना होगा।

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

5
अपाचे 2.4.35 के साथ अपने सर्वर पर / पीएचपी 7.0.26 चर $_SERVER['REQUEST_URI']करता नहीं #fragment शामिल
user9645

-5

क्वेरी स्ट्रिंग में हैशमार्क के बाद डेटा प्राप्त करना सरल है। यहां एक उदाहरण का उपयोग किया जाता है जब कोई ग्राहक किसी पुस्तक की शब्दावली का उपयोग करता है। यह नाम दिया गया लंगर (#tesla) लेता है, और ग्राहक को उस शब्द तक पहुँचाता है और शब्द और उसके विवरण को नीले रंग में हाइलाइट करता है ताकि उसे देखने में आसानी हो।

A. अपनी स्ट्रिंग्स को div id के साथ सेट करें, इसलिए नाम लंगर चला जाता है जहां इसकी माना जाता है और जावास्क्रिप्ट पाठ के रंगों को बदल सकता है

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

B. जावास्क्रिप्ट का उपयोग करें भारी काम करने के लिए, सर्वर की ओर, अपने PHP पेज में, या जहाँ भी डाला जाए।

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

C. मैं पेज लोड होने पर जावा फ़ंक्शन को स्वचालित रूप से लॉन्च कर रहा हूं।

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

डी। सर्वर द्वारा प्राप्त यूआरएल से लंगर (#tesla) प्राप्त करें

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

ई। हैश साइन ऑफ को ट्रिम करें

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

एफ। मुझे शब्द और विवरण पर प्रकाश डालने की आवश्यकता है इसलिए मैं एक नया संस्करण बनाता हूं

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

जी। अब मैं शब्द और विवरण के लिए पाठ रंग में हेरफेर कर सकता हूं

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

एच। यह काम करता है। क्लाइंट क्लाइंट साइड पर लिंक पर क्लिक करता है (xyz.com # tesla) और शब्द के दाईं ओर जाता है। शब्द और विवरण को त्वरित पढ़ने के लिए जावास्क्रिप्ट द्वारा नीले रंग में हाइलाइट किया गया है .. अन्य सभी प्रविष्टियों को काले रंग में छोड़ दिया गया है।


3
यह जवाब केवल क्लाइंट-साइड के टुकड़े से निपटता है, जबकि सवाल सर्वर-साइड (PHP के साथ) के बारे में है।
मार्टिज़न हेमेल्स

क्लाइंट साइड सेटअप के साथ ठीक से, फिर सर्वर साइड PHP के साथ आसान है।
जेम्सड -०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.