Dapatkan fragmen (nilai setelah hash '#') dari URL di php [ditutup]

107

Bagaimana cara memilih fragmen setelah simbol '#' di URL saya menggunakan PHP?
Hasil yang saya inginkan adalah "photo45".

Ini adalah contoh URL:
http://example.com/site/gallery/1#photo45

ilija veselica
sumber
1
PHP tidak dapat memperoleh URL lengkap, termasuk nama jangkar. Karena apa pun yang dapat dimanipulasi oleh JavaScript dan DOM mungkin perlu diproses oleh PHP, tidak masuk akal jika PHP tidak dapat memperoleh seluruh URL yang dipanggilnya. Tampaknya menjadi bug yang sangat besar di PHP, kecuali saya melewatkan sesuatu.
David Spector

Jawaban:

120

Jika Anda ingin mendapatkan nilai setelah tanda pagar atau jangkar seperti yang ditampilkan di browser pengguna: Ini tidak mungkin dilakukan dengan HTTP "standar" karena nilai ini tidak pernah dikirim ke server (karenanya tidak akan tersedia di $_SERVER["REQUEST_URI"]atau serupa variabel standar). Anda akan membutuhkan semacam keajaiban JavaScript di sisi klien, misalnya untuk memasukkan nilai ini sebagai parameter POST.

Jika ini hanya tentang mem-parsing URL yang dikenal dari sumber apa pun, jawaban mck89 baik-baik saja.

sfussenegger.dll
sumber
40
alert(window.location.hash);
sfussenegger
5
hanya sebuah catatan: window.location.hashmemberi Anda seluruh fragmen TERMASUK tanda #[hash] ... dan itu, tentu saja, dalam JavaScript :)
jave.web
2
BTW: Sihir 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); });... tergantung pada "metode" formulir Anda, Anda mendapatkan hash dengan $_POST['fragment']atau $_GET['fragment'].... MAGIC!
jave.
nilai setelah hashmark dapat diperoleh dari sisi server. Saya tunjukkan solusi di bawah ini.
JamesAD-0
bagian dari jawaban Anda tidak lagi benar di Chrome chromestatus.com/feature/4753419730419712 dan Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 keduanya mengirimkan ini ke server
Jeff Puckett
41

Bagian itu disebut "fragmen" dan Anda bisa mendapatkannya dengan cara ini:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
sumber
Itu sangat bagus tetapi akan menjadi tanpa kesalahan jika Anda menambahkan `` $ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragment']: ''; `` Tapi tetap Jempol !!
John Max
11
ini berfungsi untuk url yang disimpan di dalam string bukan url sebenarnya dari bilah alamat browser
Muhammad Omer Aslam
2
Ini benar tetapi bukan jawaban yang benar untuk pertanyaan awal. Penanya tidak memiliki string URL lengkap.
Derek Joseph Olson
2
Penanya tidak secara spesifik mengatakan bahwa dia tidak jujur ​​pada URL-nya atau bahwa dia memerlukan fragmen dari URL yang saat ini ditampilkan di bilah alamat browser. Dia bertanya bagaimana untuk mengurai fragement dari sebuah URL, jadi kecuali ia diedit pertanyaannya, jawaban ini harus denda cukup.
DrLightman
1
Sebenarnya Anda bisa mendapatkan fragmen dalam satu baris:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk
38

A) sudah memiliki url dengan #hash di PHP? Mudah! Parse saja!

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

Atau dalam PHP "lama" Anda harus menyimpan terlebih dahulu yang meledak untuk mengakses array:

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

B) Anda ingin mendapatkan #hash dengan mengirimkan formulir ke PHP?
    => Gunakan beberapa JavaScript MAGIC! (Untuk memproses formulir sebelumnya)

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

Tergantung pada Anda form's methodatribut Anda mendapatkan hash ini di PHP dengan:
$_GET['fragment']atau$_POST['fragment']

Kemungkinan pengembalian: 1. ""[string kosong] (tanpa hash) 2. seluruh hash TERMASUK tanda #[hash] (karena kita telah menggunakan window.location.hashdi JavaScript yang berfungsi seperti itu :))

C) Anda ingin mendapatkan #hash di PHP HANYA dari URL yang diminta?

                                    ANDA TIDAK BISA!

... (tidak saat mempertimbangkan permintaan HTTP biasa) ...

... Semoga ini membantu :)

jave.web
sumber
9

Saya telah mencari solusi untuk ini sebentar - dan satu-satunya hal yang saya temukan adalah menggunakan penulisan ulang URL untuk membaca "jangkar". Saya menemukan di apache docs di sini http://httpd.apache.org/docs/2.2/rewrite/advanced.html berikut ini ...

Secara default, mengalihkan ke jangkar HTML tidak berfungsi, karena mod_rewrite mengesampingkan karakter #, mengubahnya menjadi% 23. Ini, pada gilirannya, memutus pengalihan.

Solusi: Gunakan flag [NE] pada RewriteRule. NE adalah singkatan dari No Escape.

Diskusi: Teknik ini tentunya juga akan bekerja dengan karakter khusus lainnya yang mod_rewrite, secara default, URL-encode.

Mungkin ada peringatan lain dan apa yang tidak ... tapi saya pikir setidaknya melakukan sesuatu dengan # di server itu mungkin.

Bronson
sumber
1
Apakah Anda menguji ini? Apakah itu bekerja? Yang lain mengatakan nama jangkar tidak pernah dikirim dalam permintaan.
David Spector
3

Saya menemukan trik ini jika Anda bersikeras menginginkan nilai dengan PHP. pisahkan nilai anchor ( #) dan dapatkan dengan JavaScript, lalu simpan sebagai cookie, setelah itu dapatkan nilai cookie dengan PHP

jihchuan
sumber
Bagus, tetapi hanya berfungsi di browser dengan cookie. Tidak berfungsi misalnya dengan permintaan curl.
Marcin Jaworski
0

Anda dapat melakukannya dengan kombinasi javascript dan php:

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

Dan di sisi lain;

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

Kemudian, pada pengiriman formulir Anda dapat mengambil nilainya melalui $ _POST ['hash'] (setel formulir)

Boris Javier Barrera
sumber
Tidak menjawab pertanyaan itu.
David Spector
0

Jika Anda ingin mengambil hash dari URL secara dinamis, ini harus berfungsi: 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;
?>
samjco
sumber
Dan bagaimana Anda mengeksekusi JavaScript dari dalam skrip PHP tanpa permintaan tambahan?
David Spector
-1

Anda perlu mengurai url terlebih dahulu, jadi seperti ini:

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

Jika Anda perlu mengurai url sebenarnya dari browser saat ini, Anda perlu meminta untuk memanggil server.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
JJ Labajo
sumber
5
Pada server saya dengan apache 2.4.35 / PHP 7.0.26 variabel $_SERVER['REQUEST_URI']tidak tidak termasuk #fragment
user9645
-5

Mendapatkan data setelah tanda pagar dalam string kueri itu sederhana. Berikut adalah contoh yang digunakan saat klien mengakses daftar istilah dari sebuah buku. Ini mengambil nama jangkar yang dikirimkan (#tesla), dan mengantarkan klien ke istilah itu dan menyoroti istilah dan deskripsinya dengan warna biru sehingga mudah dilihat.

A. menyiapkan string Anda dengan id div, sehingga nama jangkar pergi ke tempat yang seharusnya dan javascript dapat mengubah warna teks

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

B. Menggunakan Javascript untuk melakukan pekerjaan berat, di sisi server, dimasukkan ke halaman PHP Anda, atau di mana pun ..

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

C. Saya meluncurkan fungsi java secara otomatis saat halaman dimuat.

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

D. mendapatkan jangkar (#tesla) dari url yang diterima oleh server

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

E. potong tanda hash itu

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

F. Saya perlu menyorot istilah dan deskripsi jadi saya membuat var baru

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

G. Sekarang saya dapat memanipulasi warna teks untuk istilah dan deskripsi

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

H. Ini berhasil. klien mengklik tautan di sisi klien (xyz.com # tesla) dan langsung menuju istilah. istilah dan deskripsi disorot dengan warna biru oleh javascript untuk membaca cepat .. semua entri lainnya dibiarkan hitam ..

JamesAD-0
sumber
3
Jawaban ini hanya berurusan dengan penanganan sisi klien dari fragmen, sedangkan pertanyaannya adalah tentang sisi server (dengan PHP).
Martijn Heemels
dengan pengaturan sisi klien yang benar, maka sisi server mudah dengan PHP.
JamesAD-0