Php'deki bir URL'den parça ('#' karakterinden sonraki değer) [kapalı] alın


107

PHP kullanarak URL'mdeki '#' sembolünden sonraki parçayı nasıl seçebilirim?
İstediğim sonuç "photo45".

Bu örnek bir URL'dir:
http://example.com/site/gallery/1#photo45





1
PHP, bağlantı adı dahil tam bir URL elde edemez. JavaScript ve DOM'un işleyebileceği herhangi bir şeyin PHP tarafından işlenmesi gerekebileceğinden, PHP'nin çağrıldığı URL'nin tamamını elde edememesi bir anlam ifade etmez. Bir şeyi kaçırmıyorsam PHP'de çok büyük bir hata gibi görünüyor.
David Spector

Yanıtlar:


120

Bir kullanıcının tarayıcısında görüldüğü gibi karma işareti veya çapa sonra değeri elde etmek istiyorsanız: Bu, bu değer sunucuya gönderilir asla olarak (dolayısıyla mevcut olmayacaktır HTTP "standart" ile mümkün değildir $_SERVER["REQUEST_URI"]ya da benzer önceden tanımlanmış değişkenler). İstemci tarafında, örneğin bu değeri bir POST parametresi olarak eklemek için bir çeşit JavaScript sihrine ihtiyacınız olacaktır.

Sadece bilinen bir URL'yi hangi kaynaktan olursa olsun ayrıştırmakla ilgiliyse , mck89'un cevabı mükemmeldir.


40
alert(window.location.hash);
sfussenegger

5
sadece bir not: window.location.hashsize #[hash] işareti DAHİL tüm parçayı alır ... ve elbette JavaScript'te :)
jave.web

2
BTW: JavaScript sihri: 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); });... formunuzun "yöntemine" bağlı olarak hash'i $_POST['fragment']veya ile alırsınız $_GET['fragment'].... BÜYÜLÜ!
jave.web

hashmark sonrasındaki değer sunucu tarafından alınabilir. Aşağıda bir çözüm gösteriyorum.
JamesAD-0

Chrome chromestatus.com/feature/4753419730419712 ve Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178'de yanıtınızın bir kısmı artık doğru değil her ikisi de bunu sunucuya gönderiyor
Jeff Puckett

41

Bu kısma "parça" adı verilir ve şu şekilde elde edebilirsiniz:

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

Bu çok iyi ama `` $ fragment = isset ($ url ['fragment']) ekleseydiniz hatasız olurdu. "#". $ url ['parça']: ''; `` Ama yine de Yaşasın !!
John Max

11
Bir url için bu eserler bir dize değil tarayıcı adres çubuğundan gerçek url içine kaydedilen
Muhammed Ömer Eslem

2
Bu doğrudur, ancak orijinal soru için doğru cevap değildir. Soruyu soran tam URL dizesine sahip değil.
Derek Joseph Olson

2
Soruyu soran, dürüst olmak gerekirse URL'ye sahip olmadığını veya tarayıcının adres çubuğunda şu anda görüntülenen URL'nin parçasına ihtiyacı olduğunu söylemedi. Bir URL'den kesilmenin nasıl ayrıştırılacağını sordu , bu nedenle sorusunu düzenlemediği sürece bu yanıt yeterince iyi olacaktır.
DrLightman

1
Aslında parçayı tek satırda alabilirsiniz:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

A) PHP'de #hash içeren bir url var mı? Kolay! Sadece ayrıştırın!

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

Veya "eski" PHP'de, diziye erişmek için patlatılanı önceden depolamalısınız:

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

B) PHP'ye bir form göndererek #hash almak mı istiyorsunuz?
    => Biraz JavaScript MAGIC kullanın! (Formu önceden işlemek için)

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

Sizin bağlı form's methodbağlıyor PHP bu karma almak:
$_GET['fragment']ya$_POST['fragment']

Olası dönüşler: 1. ""[boş dize] (karma yok) 2. #[karma] işareti DAHİL OLAN bütün karma (çünkü biz window.location.hashJavaScript'te sadece bu şekilde çalışan) kullandık :))

C) PHP'deki #hash'i SADECE istenen URL'den almak mı istiyorsunuz ?

                                    YAPAMAZSIN!

... (normal HTTP istekleri düşünülürken değil) ...

... Umarım bu yardımcı olmuştur :)


9

Bir süredir bunun için bir geçici çözüm arıyordum - ve bulduğum tek şey "çapayı" okumak için URL yeniden yazımlarını kullanmak. Buradaki apache belgelerinde http://httpd.apache.org/docs/2.2/rewrite/advanced.html aşağıdakileri buldum ...

Varsayılan olarak, bir HTML bağlantısına yeniden yönlendirme çalışmaz, çünkü mod_rewrite # karakterinden kaçarak onu% 23'e dönüştürür. Bu da yeniden yönlendirmeyi bozar.

Çözüm: RewriteRule'da [NE] bayrağını kullanın. NE, Kaçış Yok anlamına gelir.

Tartışma: Bu teknik, tabii ki, mod_rewrite'ın varsayılan olarak URL kodladığı diğer özel karakterlerle de çalışacaktır.

Başka uyarılar olabilir ve olmayabilir ... ama en azından sunucuda # ile bir şeyler yapmanın mümkün olduğunu düşünüyorum.


1
Bunu test ettin mi? Çalışıyor mu? Diğerleri, çapa adının hiçbir zaman istekte gönderilmediğini söylüyor.
David Spector


3

PHP ile değeri istemekte ısrar ediyorsanız bu numarayı buldum. anchor ( #) değerini bölün ve JavaScript ile alın, ardından çerez olarak saklayın, ardından PHP ile çerez değerini alın


Güzel, ancak yalnızca çerezli tarayıcıda çalışıyor. Örneğin curl isteği ile çalışmıyor.
Marcin Jaworski

0

Bunu javascript ve php kombinasyonuyla yapabilirsiniz:

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

Ve diğer tarafta;

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

Ardından, form gönderirken değeri $ _POST ['hash'] yoluyla alabilirsiniz (formu ayarlayın)


Soruyu cevaplamıyor.
David Spector

0

Eğer hash'i URL'den dinamik olarak almak istiyorsanız, bu çalışmalıdır: 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;
?>

Ve JavaScript'i PHP betiğinin içinden fazladan bir istek olmadan nasıl çalıştırırsınız?
David Spector

-1

Önce url'yi ayrıştırmanız gerekir, bu yüzden şöyle olur:

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

Mevcut tarayıcının gerçek url'sini ayrıştırmanız gerekirse, sunucuyu arama talebinde bulunmanız gerekir.

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

5
Apache 2.4.35 ile benim sunucuda / PHP 7.0.26 değişken $_SERVER['REQUEST_URI']yok değil #fragment şunlardır
user9645

-5

Bir sorgu dizesindeki hashmarktan sonraki verileri almak basittir. Burada, bir müşteri bir kitaptan bir terimler sözlüğüne eriştiğinde kullanılan bir örnek verilmiştir. Sunulan ad çapasını (#tesla) alır ve müşteriyi o terime teslim eder ve görmesi kolay olması için terimi ve açıklamasını mavi renkte vurgular.

A. dizelerinizi bir div id ile ayarlayın, böylece ad bağlantısı olması gereken yere gider ve javascript metin renklerini değiştirebilir

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

B. Ağır işi yapmak için, sunucu tarafında, PHP sayfanıza eklenmiş veya herhangi bir yerde Javascript kullanın ..

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

C. Sayfa yüklendiğinde java işlevini otomatik olarak başlatıyorum.

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

D. sunucu tarafından alınan url'den çapayı (#tesla) alın

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

E. hash işaretini kırpın

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

F. Terimi ve açıklamayı vurgulamalıyım, böylece yeni bir değişken oluşturabilirim

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

G. Artık terim ve açıklama için metin rengini değiştirebilirim

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

H. Bu işe yarıyor. müşteri, müşteri tarafındaki (xyz.com # tesla) bağlantıya tıklar ve doğrudan terime gider. hızlı okuma için terim ve açıklama javascript ile mavi renkte vurgulanır .. diğer tüm girişler siyah olarak bırakılır ..


3
Bu yanıt yalnızca parçanın istemci tarafında işlenmesiyle ilgilenirken, soru sunucu tarafında (PHP ile) ilgilidir.
Martijn Heemels

istemci tarafı kurulumu düzgün yapıldığında, sunucu tarafı PHP ile kolaydır.
JamesAD-0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.