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
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
Yanıtlar:
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.
alert(window.location.hash);
window.location.hash
size #
[hash] işareti DAHİL tüm parçayı alır ... ve elbette JavaScript'te :)
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Ü!
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
$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
Veya "eski" PHP'de, diziye erişmek için patlatılanı önceden depolamalısınız:
$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
});
Sizin bağlı form
's method
bağ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.hash
JavaScript'te sadece bu şekilde çalışan) kullandık :))
... (normal HTTP istekleri düşünülürken değil) ...
... Umarım bu yardımcı olmuştur :)
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.
Hash işaretinden sonra metni alamazsınız . Bir istekte sunucuya gönderilmez.
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
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)
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;
?>
Ö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'
$_SERVER['REQUEST_URI']
yok değil #fragment şunlardır
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 ..