Pobierz fragment (wartość po krzyżyku „#”) z adresu URL w php [zamknięty]


107

Jak mogę zaznaczyć fragment po symbolu „#” w moim adresie URL za pomocą PHP?
Wynik, który chcę, to „zdjęcie45”.

Oto przykładowy adres URL:
http://example.com/site/gallery/1#photo45





1
PHP nie może uzyskać pełnego adresu URL, w tym nazwy kotwicy. Ponieważ wszystko, czym JavaScript i DOM może manipulować, może wymagać przetworzenia przez PHP, nie ma sensu, że PHP nie może uzyskać całego adresu URL, z którym jest wywoływany. Wygląda na bardzo duży błąd w PHP, chyba że czegoś mi brakuje.
David Spector

Odpowiedzi:


120

Jeśli chcesz uzyskać wartość po znaku krzyżyka lub kotwicy, jak pokazano w przeglądarce użytkownika: Nie jest to możliwe w przypadku „standardowego” protokołu HTTP, ponieważ ta wartość nigdy nie jest wysyłana na serwer (dlatego nie będzie dostępna w $_SERVER["REQUEST_URI"]lub podobnych predefiniowane zmienne). Potrzebowałbyś jakiegoś rodzaju magii JavaScript po stronie klienta, np. Aby uwzględnić tę wartość jako parametr POST.

Jeśli chodzi tylko o parsowanie znanego adresu URL z dowolnego źródła, odpowiedź mck89 jest jednak w porządku.


40
alert(window.location.hash);
sfussenegger

5
tylko uwaga: window.location.hashdostajesz cały fragment, W TYM #znak [hash] ... i jest to oczywiście w JavaScript :)
jave.web

2
BTW: JavaScript magic: 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); });... w zależności od "metody" twojego formularza otrzymujesz hash przez $_POST['fragment']lub $_GET['fragment'].... MAGIC!
jave.web

wartość po znaku skrótu można pobrać po stronie serwera. Poniżej przedstawiam rozwiązanie.
JamesAD-0,

część odpowiedzi nie jest już poprawna w Chrome chromestatus.com/feature/4753419730419712 i Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178, oba wysyłają to na serwer
Jeff Puckett

41

Ta część nazywa się „fragmentem” i możesz ją pobrać w ten sposób:

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

To bardzo dobrze, ale nie byłoby żadnego błędu, gdybyś dodał `` $ fragment = isset ($ url ['fragment'])? „#”. $ url ['fragment']: ''; `` Ale nadal kciuki w górę !!
John Max

11
działa to dla adresu URL zapisanego w ciągu znaków, a nie rzeczywistego adresu URL z paska adresu przeglądarki
Muhammad Omer Aslam

2
To prawda, ale nie jest to poprawna odpowiedź na pierwotne pytanie. Pytający nie ma pełnego ciągu adresu URL.
Derek Joseph Olson

2
Pytający nie powiedział konkretnie, że szczerze mówiąc, nie ma adresu URL lub że potrzebuje fragmentu adresu URL aktualnie wyświetlanego w pasku adresu przeglądarki. Zapytał, jak analizować fragement ze w adresie URL, więc chyba redagował jego pytanie, to odpowiedź powinna precyzyjnie wystarczy.
DrLightman

1
Właściwie możesz pobrać fragment w jednej linii:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

A) masz już adres URL z #hash w PHP? Łatwo! Po prostu przeanalizuj to!

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

Lub w "starym" PHP, aby uzyskać dostęp do tablicy, musisz wstępnie zapisać plik rozstrzelony:

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

B) Chcesz uzyskać #hash wysyłając formularz do PHP?
    => Użyj JavaScript MAGIC! (Aby wstępnie przetworzyć formularz)

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

W zależności od form„s methodatrybut pojawi się ten skrót w PHP przez:
$_GET['fragment']lub$_POST['fragment']

Możliwe zwroty: 1. ""[pusty ciąg] (bez krzyżyka) 2. cały hash WŁĄCZAJĄC #znak [hash] (ponieważ użyliśmy znaku window.location.hashJavaScript, który po prostu działa w ten sposób :))

C) Chcesz uzyskać #hash w PHP TYLKO z żądanego adresu URL?

                                    NIE MOŻESZ!

... (nie biorąc pod uwagę zwykłych żądań HTTP) ...

... Mam nadzieję, że to pomogło :)


9

Od jakiegoś czasu szukałem obejścia tego problemu - i jedyne, co znalazłem, to użycie funkcji ponownego zapisywania adresów URL w celu odczytania „kotwicy”. Znalazłem w dokumentach Apache tutaj http://httpd.apache.org/docs/2.2/rewrite/advanced.html następujące ...

Domyślnie przekierowanie do kotwicy HTML nie działa, ponieważ mod_rewrite wymyka znak #, zamieniając go na% 23. To z kolei przerywa przekierowanie.

Rozwiązanie: użyj flagi [NE] w RewriteRule. NE oznacza No Escape.

Dyskusja: Ta technika będzie oczywiście działać również z innymi znakami specjalnymi, które mod_rewrite domyślnie kodują URL.

Może mieć inne zastrzeżenia, a co nie ... ale myślę, że przynajmniej zrobienie czegoś z # na serwerze jest możliwe.


1
Czy to przetestowałeś? Czy to działa? Inni twierdzą, że nazwa kotwicy nigdy nie jest wysyłana w żądaniu.
David Spector


3

Znalazłem tę sztuczkę, jeśli nalegasz, aby wartość w PHP. podziel wartość anchor ( #) i pobierz ją za pomocą JavaScript, następnie zapisz jako plik cookie, a następnie pobierz wartość pliku cookie za pomocą PHP


Ładnie, ale działa tylko w przeglądarce z cookies. Nie działa na przykład na żądanie curl.
Marcin Jaworski

0

Możesz to zrobić za pomocą kombinacji javascript i php:

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

I po drugiej stronie;

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

Następnie podczas przesyłania formularza możesz pobrać wartość za pomocą $ _POST ['hash'] (ustaw formularz)


Nie odpowiada na pytanie.
David Spector

0

Jeśli chcesz dynamicznie pobierać hash z adresu URL, powinno to działać: 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;
?>

I jak wykonać JavaScript z wnętrza skryptu PHP bez dodatkowego żądania?
David Spector

-1

Najpierw musisz przeanalizować adres URL, więc wygląda to tak:

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

Jeśli chcesz przeanalizować rzeczywisty adres URL bieżącej przeglądarki, musisz poprosić o połączenie z serwerem.

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

5
Na moim serwerze Apache 2.4.35 / PHP 7.0.26 zmienna $_SERVER['REQUEST_URI']ma nie obejmować #fragment
user9645

-5

Pobieranie danych po znaku skrótu w ciągu zapytania jest proste. Oto przykład używany, gdy klient uzyskuje dostęp do słownika terminów z książki. Pobiera dostarczoną kotwicę nazwy (#tesla) i dostarcza klientowi ten termin oraz wyróżnia termin i jego opis na niebiesko, aby był łatwy do zobaczenia.

A. skonfiguruj swoje ciągi z id div, aby zakotwiczenie nazwy trafiło tam, gdzie powinno, a javascript może zmienić kolory tekstu

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

B. Używaj Javascript do wykonywania ciężkiej pracy, po stronie serwera, umieszczonego na stronie PHP lub gdziekolwiek.

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

C. Uruchamiam funkcję java automatycznie po załadowaniu strony.

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

D. pobrać kotwicę (#tesla) z adresu URL otrzymanego przez serwer

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

E. obciąć z niej znak krzyżyka

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

F. Muszę podkreślić termin i opis, więc utworzę nową zmienną

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

G. Teraz mogę manipulować kolorem tekstu dla terminu i opisu

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

H. To działa. klient klika link po stronie klienta (xyz.com # tesla) i przechodzi od razu do terminu. termin i opis są podświetlone na niebiesko przez JavaScript w celu szybkiego odczytania .. wszystkie inne wpisy pozostawione na czarno ..


3
Ta odpowiedź dotyczy tylko obsługi fragmentu po stronie klienta, podczas gdy pytanie dotyczy strony serwera (z PHP).
Martijn Heemels

przy prawidłowej konfiguracji po stronie klienta strona serwera jest łatwa dzięki PHP.
JamesAD-0,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.