PHP를 사용하여 URL에서 '#'기호 뒤의 조각을 어떻게 선택할 수 있습니까?
제가 원하는 결과는 "photo45"입니다.
다음은 예제 URL입니다.
http://example.com/site/gallery/1#photo45
PHP를 사용하여 URL에서 '#'기호 뒤의 조각을 어떻게 선택할 수 있습니까?
제가 원하는 결과는 "photo45"입니다.
다음은 예제 URL입니다.
http://example.com/site/gallery/1#photo45
답변:
사용자의 브라우저에서와 같이 해시 마크 또는 앵커 후 값을 얻고 싶다면이이 값을 서버로 전송되지 않습니다으로 (따라서이 글은 사용할 수 없습니다 HTTP "표준"불가능 $_SERVER["REQUEST_URI"]
또는 이와 유사한 미리 정의 된 변수). 예를 들어이 값을 POST 매개 변수로 포함하려면 클라이언트 측에서 일종의 JavaScript 마법이 필요합니다.
소스에 관계없이 알려진 URL을 구문 분석하는 것뿐이라면 mck89 대답 은 완벽합니다.
alert(window.location.hash);
window.location.hash
당신에게 포함한 전체 조각 얻는다 #
[해시] 기호를 ... 그것은 : 자바 스크립트 물론,
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!
이 부분을 "조각"이라고하며 다음과 같이 얻을 수 있습니다.
$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
또는 "이전"PHP에서 배열에 액세스하려면 exploded를 미리 저장해야합니다.
$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
});
form
의 method
속성 에 따라 다음과 같이 PHP에서이 해시를 얻습니다.
$_GET['fragment']
또는$_POST['fragment']
가능한 반환 : 1.""
[빈 문자열] (해시 없음) 2. #
[해시] 기호를 포함 하는 전체 해시 ( window.location.hash
그 방식으로 작동하는 JavaScript를 사용했기 때문에 :))
... (일반적인 HTTP 요청을 고려하지 않음) ...
...이 도움이 되었기를 바랍니다 :)
나는 이것에 대한 해결 방법을 조금 찾고 있었는데 내가 찾은 유일한 것은 URL 재 작성을 사용하여 "앵커"를 읽는 것입니다. http://httpd.apache.org/docs/2.2/rewrite/advanced.html 여기 아파치 문서에서 다음을 발견했습니다 ...
기본적으로 HTML 앵커로 리디렉션하는 것은 작동하지 않습니다. mod_rewrite는 # 문자를 이스케이프하여 % 23으로 변환하기 때문입니다. 이것은 차례로 리디렉션을 중단합니다.
해결 방법 : RewriteRule에서 [NE] 플래그를 사용하십시오. NE는 No Escape를 의미합니다.
토론 : 물론이 기술은 mod_rewrite (기본적으로 URL 인코딩)하는 다른 특수 문자와 함께 작동합니다.
다른 경고가있을 수 있고 그렇지 않은 것이있을 수 있지만 적어도 서버에서 #으로 뭔가를하는 것은 가능하다고 생각합니다.
해시 마크 뒤에는 텍스트를 가져올 수 없습니다 . 요청시 서버로 전송되지 않습니다.
PHP로 가치를 원하면이 트릭을 찾았습니다. 앵커 ( #
) 값을 분할하고 JavaScript로 가져온 다음 쿠키로 저장 한 다음 PHP로 쿠키 값을 가져옵니다.
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'] (양식 설정)를 통해 값을 검색 할 수 있습니다.
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;
?>
먼저 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'
$_SERVER['REQUEST_URI']
가 포함되어 있지 않습니다
쿼리 문자열에서 해시 마크 뒤에 데이터를 가져 오는 것은 간단합니다. 다음은 클라이언트가 책에서 용어집에 액세스 할 때 사용되는 예입니다. 전달 된 앵커 (#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)의 링크를 클릭하고 해당 용어로 바로 이동합니다. 용어와 설명은 빠르게 읽을 수 있도록 자바 스크립트에 의해 파란색으로 강조 표시됩니다. .. 다른 모든 항목은 검은 색으로 남아 있습니다.