পিএইচপি [বন্ধ] এর একটি URL থেকে টুকরো (হ্যাশ '# এর পরে মান) পান


107

আমি কীভাবে আমার ইউআরএল পিএইচপি ব্যবহার করে '#' চিহ্নের পরে খণ্ডটি নির্বাচন করতে পারি?
আমি যে ফলাফলটি চাই তা হ'ল "ফটো 45"।

এটি একটি উদাহরণ ইউআরএল:
http://example.com/site/gallery/1#photo45





1
পিএইচপি কোনও অ্যাঙ্কর নাম সহ পুরো ইউআরএল পেতে পারে না। যেহেতু জাভাস্ক্রিপ্ট এবং ডিওএম যে কোনও কিছুই হেরফের করতে পারে পিএইচপি দ্বারা প্রক্রিয়াজাতকরণের প্রয়োজন হতে পারে, তাই এটি বোঝা যায় না যে পিএইচপি এটির সাথে যুক্ত পুরো URLটি অর্জন করতে পারে না। পিএইচপি-তে খুব বড় একটি বাগ বলে মনে হচ্ছে, যদি না আমি কিছু মিস করি।
ডেভিড স্পেক্টর

উত্তর:


120

যদি আপনি কোনও ব্যবহারকারীর ব্রাউজারে দেখানো হিসাবে হ্যাশ চিহ্ন বা অ্যাঙ্কারের পরে মান পেতে চান: "মানক" এইচটিটিপি দিয়ে এটি সম্ভব নয় কারণ এই মানটি কখনই সার্ভারে প্রেরণ করা হয় না (সুতরাং এটি উপলব্ধ $_SERVER["REQUEST_URI"]বা অনুরূপ হবে না) পূর্বনির্ধারিত পরিবর্তনশীল)) আপনার ক্লায়েন্ট পক্ষের কিছু ধরণের জাভাস্ক্রিপ্ট ম্যাজিকের প্রয়োজন হবে, উদাহরণস্বরূপ এই মানটিকে একটি পোস্ট প্যারামিটার হিসাবে অন্তর্ভুক্ত করা উচিত।

যদি এটি কেবল যে কোনও উত্স থেকে কোনও পরিচিত ইউআরএল পার্স করার বিষয়ে থাকে তবে এমকি 89 এর উত্তর যদিও পুরোপুরি ঠিক আছে।


40
alert(window.location.hash);
sfussnegger

5
কেবলমাত্র একটি দ্রষ্টব্য: [হ্যাশ] চিহ্নটি অন্তর্ভুক্ত window.location.hashকরে পুরো টুকরোটি পেয়েছে #... এবং এটি অবশ্যই জাভাস্ক্রিপ্টে :)
jave.web

2
বিটিডাব্লু: জাভাস্ক্রিপ্ট যাদু: ডি: ডি: ডি: ডি: ডি ... 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'].... ম্যাজিকের মাধ্যমে পেয়েছেন!
jave.web

সার্ভার দিক থেকে হ্যাশমার্কের পরে মানটি পাওয়া যায়। আমি নীচে একটি সমাধান দেখায়।
জেমসএডি-0

আপনার উত্তরের অংশটি ক্রোম chroststus.com/feature/4753419730419712 এবং ফায়ারফক্স 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

এটি খুব ভাল তবে আপনি যদি `` `$ টুকরা = আইসেট ($ ইউআরএল ['ফ্রেগমেন্ট']) যোগ করেন তবে কোনও ত্রুটি ছাড়াই এটি হত? '#'। $ url ['খণ্ড']: ''; `` `তবে এখনও থাম্বস আপ !!
জন সর্বোচ্চ

11
এটি ব্রাউজারের অ্যাড্রেস বার থেকে আসল ইউআরএল নয় স্ট্রিংয়ের ভিতরে সংরক্ষিত ইউআরএলটির জন্য কাজ করে
মুহাম্মদ ওমর আসলাম

2
এটি সত্য তবে মূল প্রশ্নের সঠিক উত্তর নয়। প্রশ্নকারীর পুরো URL স্ট্রিং নেই।
ডেরেক জোসেফ ওলসন

2
প্রশ্নকারী স্পষ্টতই বলেননি যে তাঁর কাছে সত্যবাদী হওয়ার URL টি ছিল না বা বর্তমানে ব্রাউজারের ঠিকানা দণ্ডে প্রদর্শিত ইউআরএল থেকে তাঁর খণ্ডের প্রয়োজন ছিল। তিনি জিজ্ঞাসা করলেন কীভাবে কোনও ইউআরএল থেকে ছদ্মবেশকে পার্স করা যায় , সুতরাং তিনি যদি নিজের প্রশ্নটি সম্পাদনা না করেন তবে এই উত্তরটি যথেষ্ট জরিমানা করা উচিত।
ড্রলাইটম্যান

1
আসলে আপনি এক লাইনে টুকরোটি পেতে পারেন:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

ক) পিএইচপি তে ইতিমধ্যে # হ্যাশ সহ ইউআরএল আছে? সহজ! শুধু এটি পার্স!

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

বা "পুরাতন" পিএইচপি-তে আপনাকে অ্যারে অ্যাক্সেস করতে বিস্ফোরণে প্রাক-সঞ্চয় করতে হবে:

$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এর methodবৈশিষ্ট্যাবলী আপনি পিএইচপি এই হ্যাশ পাবেন:
$_GET['fragment']বা$_POST['fragment']

সম্ভাব্য আয়: 1. ""[ফাঁকা স্ট্রিং] (কোনও হ্যাশ নেই) 2. পুরো হ্যাশটি #[হ্যাশ] চিহ্নটি অন্তর্ভুক্ত করছে (কারণ আমরা window.location.hashজাভাস্ক্রিপ্টটিতে ব্যবহার করেছি যা ঠিক সেভাবে কাজ করে :))

গ) আপনি পিএইচপি #hash পেতে চান জাস্ট অনুরোধ করা URL থেকে?

                                    আপনি পারবেন না!

... (নিয়মিত HTTP অনুরোধ বিবেচনা করার সময় নয়) ...

... আশা করি এটি সাহায্য করেছে :)


9

আমি এটির জন্য কিছুটা কাজের জন্য অনুসন্ধান করেছি - এবং আমি খুঁজে পেয়েছি কেবলমাত্র "অ্যাঙ্কর" পড়ার জন্য ইউআরএল পুনর্লিখনগুলি ব্যবহার করা। আমি এখানে অ্যাপাচি ডক্সে পেয়েছি http://httpd.apache.org/docs/2.2/rewrite/advanced.html নিম্নলিখিত ...

ডিফল্টরূপে, এইচটিএমএল অ্যাঙ্কারে পুনঃনির্দেশ কাজ করে না, কারণ মোড_আরউইরট # অক্ষর থেকে অব্যাহতি পেয়ে এটিকে% 23 এ পরিণত করে। এটি পরিবর্তে পুনঃনির্দেশটি ভেঙে দেয়।

সমাধান: পুনর্লিখনের উপর [এনই] পতাকা ব্যবহার করুন। এনই মানে নো এস্কেপ।

আলোচনা: এই কৌশলটি অবশ্যই অন্যান্য বিশেষ অক্ষরের সাথেও কাজ করবে যা ডিফল্টরূপে, ইউআরএল-এনকোডগুলি মোড_উইরাইট করে।

এটিতে অন্যান্য সতর্কতা থাকতে পারে এবং কী না ... তবে আমি মনে করি যে সার্ভারে কমপক্ষে # দিয়ে কিছু করা সম্ভব।


1
আপনি এটি পরীক্ষা করেছেন? এটা কি কাজ করে? আবার কেউ কেউ বলছেন যে অ্যাঙ্কর নামটি অনুরোধে কখনই প্রেরণ করা হয় না।
ডেভিড স্পেক্টর

6

হ্যাশ চিহ্নের পরে আপনি পাঠ্যটি পেতে পারেন না । এটি একটি অনুরোধে সার্ভারে প্রেরণ করা হয় না।


তবে আমরা jquery ব্যবহার করে # মানটি পেতে পারি
শাকির ব্লুচ

1
এই উত্তরটি আর ক্রোম chroststus.com/feature/4753419730419712 এবং ফায়ারফক্স bugzilla.mozilla.org/show_bug.cgi?id=1264178
জেফ

3

আপনি পিএইচপি দিয়ে মান চাইলে আমি এই কৌশলটি পেয়েছি। অ্যাঙ্কর ( #) মানটি বিভক্ত করুন এবং এটি জাভাস্ক্রিপ্টের সাহায্যে পাবেন, তারপরে কুকি হিসাবে সংরক্ষণ করুন, তারপরে পিএইচপি দিয়ে কুকি মান পান


দুর্দান্ত, তবে কেবল কুকি সহ ব্রাউজারে কাজ করছেন। কার্ল অনুরোধ দ্বারা উদাহরণস্বরূপ কাজ না।
মার্সিন জাওয়ার্সকি

0

আপনি এটি জাভাস্ক্রিপ্ট এবং পিএইচপি এর সংমিশ্রণ দ্বারা করতে পারেন:

<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

আপনি যদি ইউআরএল থেকে গতিশীলভাবে হ্যাশটি ধরতে চান তবে এটি কাজ করা উচিত: 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;
?>

এবং কীভাবে আপনি কোনও অতিরিক্ত অনুরোধ ছাড়াই পিএইচপি স্ক্রিপ্টের ভিতরে থেকে জাভাস্ক্রিপ্ট কার্যকর করবেন?
ডেভিড স্পেক্টর

-1

আপনাকে প্রথমে ইউআরএল পার্স করতে হবে, সুতরাং এটি এরকম হয়:

$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 সঙ্গে আমার সার্ভারে চালু / পিএইচপি 7.0.26 পরিবর্তনশীল $_SERVER['REQUEST_URI']নেই না #fragment অন্তর্ভুক্ত
user9645

-5

ক্যোরি স্ট্রিংয়ে হ্যাশমার্কের পরে ডেটা পাওয়া সহজ। এখানে যখন একটি ক্লায়েন্ট কোনও বই থেকে শব্দের একটি শব্দকোষ অ্যাক্সেস করে তার জন্য ব্যবহৃত একটি উদাহরণ। এটি নাম নোঙ্গর সরবরাহ করা (#tesla) লাগে এবং ক্লায়েন্টকে সেই পদে সরবরাহ করে এবং শব্দটি এবং এর বর্ণকে নীল বর্ণিত করে যাতে এটি সহজে দেখা যায়।

উ: ডিভিডি আইডির সাহায্যে আপনার স্ট্রিংগুলি সেটআপ করুন, তাই নাম অ্যাঙ্করটি যেখানে চলেছে সেখানে যেতে হবে এবং জাভাস্ক্রিপ্টটি পাঠ্যের রঙ পরিবর্তন করতে পারে

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

বি। আপনার পিএইচপি পৃষ্ঠাতে বা যেখানেই inোকানো হয়েছে সার্ভারের দিকে ভারী কাজ করতে জাভাস্ক্রিপ্ট ব্যবহার করুন ..

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

সি। পৃষ্ঠাটি লোড হওয়ার পরে আমি স্বয়ংক্রিয়ভাবে জাভা ফাংশন চালু করব।

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

ডি সার্ভারের প্রাপ্ত ইউআরএল থেকে অ্যাঙ্কর (#tesla) পান

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

E এর হ্যাশ সাইন অফটি ছাঁটাই করুন

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 # টেসলা) এবং পদটিতে ডানদিকে যায়। শব্দটি এবং বিবরণটি দ্রুত পড়ার জন্য জাভাস্ক্রিপ্ট দ্বারা নীলভাবে হাইলাইট করা হয়েছে .. অন্যান্য সমস্ত এন্ট্রি কালো রেখে দেওয়া হয়েছে ..


3
এই উত্তরটি কেবল খণ্ডটির ক্লায়েন্ট-সাইড হ্যান্ডলিংয়ের সাথে সম্পর্কিত, যখন প্রশ্নটি সার্ভার-সাইড (পিএইচপি সহ) সম্পর্কিত।
মার্টিজন হিমেলস

সঠিকভাবে ক্লায়েন্ট সাইড সেটআপ দিয়ে, তারপরে পিএইচপি দিয়ে সার্ভার সাইডটি সহজ।
জেমসএডি -0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.