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.