PHP의 URL에서 조각 (해시 '#'뒤의 값) 가져 오기 [닫힘]


107

PHP를 사용하여 URL에서 '#'기호 뒤의 조각을 어떻게 선택할 수 있습니까?
제가 원하는 결과는 "photo45"입니다.

다음은 예제 URL입니다.
http://example.com/site/gallery/1#photo45





1
PHP는 앵커 이름을 포함하여 완전한 URL을 얻을 수 없습니다. JavaScript 및 DOM이 조작 할 수있는 모든 것은 PHP에서 처리해야 할 수 있으므로 PHP가 호출되는 전체 URL을 가져올 수 없다는 것은 의미가 없습니다. 내가 뭔가 빠뜨리지 않는 한 PHP에서 매우 큰 버그 인 것 같습니다.
David Spector

답변:


120

사용자의 브라우저에서와 같이 해시 마크 또는 앵커 후 값을 얻고 싶다면이이 값을 서버로 전송되지 않습니다으로 (따라서이 글은 사용할 수 없습니다 HTTP "표준"불가능 $_SERVER["REQUEST_URI"]또는 이와 유사한 미리 정의 된 변수). 예를 들어이 값을 POST 매개 변수로 포함하려면 클라이언트 측에서 일종의 JavaScript 마법이 필요합니다.

소스에 관계없이 알려진 URL을 구문 분석하는 것뿐이라면 mck89 대답 은 완벽합니다.


40
alert(window.location.hash);
sfussenegger

5
단지 참고 사항 : window.location.hash당신에게 포함한 전체 조각 얻는다 #[해시] 기호를 ... 그것은 : 자바 스크립트 물론,
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); });... 폼의 "메서드"에 따라 해시를 얻 $_POST['fragment']거나 $_GET['fragment'].... MAGIC!
jave.web

해시 마크 뒤의 값은 서버 측에서 가져올 수 있습니다. 아래에 해결책을 보여줍니다.
JamesAD-0

당신의 대답의 일부는 더 이상 크롬에서 정확하지 chromestatus.com/feature/4753419730419712 와 파이어 폭스는 bugzilla.mozilla.org/show_bug.cgi?id=1264178 모두 서버에이를 보내려면 어떻게합니까
제프 퍼켓

41

이 부분을 "조각"이라고하며 다음과 같이 얻을 수 있습니다.

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

그것은 매우 좋지만```$ fragment = isset ($ url [ 'fragment'])?를 추가한다면 오류가 없었을 것입니다. '#'. $ url [ 'fragment'] : ''; ```그래도 최고야 !!
존 맥스

11
이것은 브라우저 주소 표시 줄의 실제 URL이 아닌 문자열 내부에 저장된 URL에서 작동합니다
Muhammad Omer Aslam

2
이것은 사실이지만 원래 질문에 대한 정답은 아닙니다. 질문자는 전체 URL 문자열이 없습니다.
Derek Joseph Olson

2
질문자는 솔직히 URL이 없거나 브라우저의 주소 표시 줄에 현재 표시된 URL의 조각이 필요하다고 구체적으로 말하지 않았습니다. 그는에서의 fragment를 구문 분석하는 방법을 묻는 , URL 그는 자신의 질문을 편집하지 않는 한 지금,이 대답은 충분히 미세해야한다.
DrLightman

1
실제로 한 줄로 조각을 얻을 수 있습니다.$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

A) 이미 PHP에 #hash가있는 URL이 있습니까? 쉬운! 그냥 파싱하세요!

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

또는 "이전"PHP에서 배열에 액세스하려면 exploded를 미리 저장해야합니다.

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

B) PHP로 양식을 보내서 #hash를 얻고 싶습니까?
    => JavaScript MAGIC을 사용하십시오! (양식을 전처리하려면)

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

formmethod속성 에 따라 다음과 같이 PHP에서이 해시를 얻습니다.
$_GET['fragment'] 또는$_POST['fragment']

가능한 반환 : 1."" [빈 문자열] (해시 없음) 2. #[해시] 기호를 포함 하는 전체 해시 ( window.location.hash그 방식으로 작동하는 JavaScript를 사용했기 때문에 :))

C) PHP에서 #hash를 얻고 싶습니다. 그냥 요청 URL에서를?

                                    당신은 할 수 없습니다!

... (일반적인 HTTP 요청을 고려하지 않음) ...

...이 도움이 되었기를 바랍니다 :)


9

나는 이것에 대한 해결 방법을 조금 찾고 있었는데 내가 찾은 유일한 것은 URL 재 작성을 사용하여 "앵커"를 읽는 것입니다. http://httpd.apache.org/docs/2.2/rewrite/advanced.html 여기 아파치 문서에서 다음을 발견했습니다 ...

기본적으로 HTML 앵커로 리디렉션하는 것은 작동하지 않습니다. mod_rewrite는 # 문자를 이스케이프하여 % 23으로 변환하기 때문입니다. 이것은 차례로 리디렉션을 중단합니다.

해결 방법 : RewriteRule에서 [NE] 플래그를 사용하십시오. NE는 No Escape를 의미합니다.

토론 : 물론이 기술은 mod_rewrite (기본적으로 URL 인코딩)하는 다른 특수 문자와 함께 작동합니다.

다른 경고가있을 수 있고 그렇지 않은 것이있을 수 있지만 적어도 서버에서 #으로 뭔가를하는 것은 가능하다고 생각합니다.


1
이것을 테스트 했습니까? 작동합니까? 다른 사람들은 앵커 이름이 요청에 전송되지 않는다고 말합니다.
David Spector


3

PHP로 가치를 원하면이 트릭을 찾았습니다. 앵커 ( #) 값을 분할하고 JavaScript로 가져온 다음 쿠키로 저장 한 다음 PHP로 쿠키 값을 가져옵니다.


좋지만 쿠키가있는 브라우저에서만 작동합니다. 예를 들어 컬 요청으로 작동하지 않습니다.
Marcin Jaworski

0

javascript와 php의 조합으로 할 수 있습니다.

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

그리고 다른쪽에는

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

그런 다음 양식 제출시 $ _POST [ 'hash'] (양식 설정)를 통해 값을 검색 할 수 있습니다.


질문에 대답하지 않습니다.
David Spector

0

URL에서 동적으로 해시를 가져 오려면 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;
?>

추가 요청없이 PHP 스크립트 내에서 JavaScript를 어떻게 실행합니까?
David Spector

-1

먼저 URL을 구문 분석해야하므로 다음과 같이됩니다.

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

현재 브라우저의 실제 URL을 구문 분석해야하는 경우 서버 호출을 요청해야합니다.

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

5
아파치 2.4.35 / PHP 7.0.26을 사용하는 내 서버에서 변수 에 #fragment $_SERVER['REQUEST_URI']가 포함되어 있지 않습니다
user9645

-5

쿼리 문자열에서 해시 마크 뒤에 데이터를 가져 오는 것은 간단합니다. 다음은 클라이언트가 책에서 용어집에 액세스 할 때 사용되는 예입니다. 전달 된 앵커 (#tesla)라는 이름을 사용하여 클라이언트에게 해당 용어를 전달하고 용어와 설명을 쉽게 볼 수 있도록 파란색으로 강조 표시합니다.

A. div ID로 문자열을 설정하면 앵커 이름이 예상되는 위치로 이동하고 자바 스크립트가 텍스트 색상을 변경할 수 있습니다.

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

B. Javascript를 사용하여 서버 측에서 PHP 페이지에 삽입하거나 어디에서나 무거운 작업을 수행하십시오.

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

C. 페이지가로드 될 때 자동으로 Java 함수를 시작합니다.

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

D. 서버가 수신 한 URL에서 앵커 (#tesla) 가져 오기

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

E. 해시 사인 오프 트림

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

F. 용어와 설명을 강조 표시해야하므로 새 변수를 만듭니다.

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

G. 이제 용어 및 설명의 텍스트 색상을 조작 할 수 있습니다.

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

H. 작동합니다. 클라이언트가 클라이언트 측 (xyz.com # tesla)의 링크를 클릭하고 해당 용어로 바로 이동합니다. 용어와 설명은 빠르게 읽을 수 있도록 자바 스크립트에 의해 파란색으로 강조 표시됩니다. .. 다른 모든 항목은 검은 색으로 남아 있습니다.


3
이 답변은 조각의 클라이언트 측 처리 만 다루며 질문은 서버 측 (PHP 사용)에 관한 것입니다.
Martijn Heemels

클라이언트 측 설정이 제대로 된 경우 서버 측은 PHP로 쉽습니다.
JamesAD-0 2017
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.