2012-04-24 2 views
1

URL에서 쿼리 문자열을 제거하려고 시도하지만 첫 번째 키를 그대로 두어야합니다. 그래서 나는 앰퍼샌드의 첫 번째 어커런스가 쿼리 문자열을 버리고 자하는 지점인지 알 수 있습니다. 이 일을하는 가장 좋은 방법은 무엇입니까? 아래 코드는 현재 쿼리 문자열에 계속 추가됩니다.첫 번째 앰퍼샌드 다음에 나머지 쿼리 문자열을 제거하십시오.

<a href="<?php echo $_SERVER["REQUEST_URI"] ?>&sortkey=year&sortval=asc"> 

답변

1

내가 제대로 질문을 이해하면, 당신은 앰퍼샌드의 첫번째 발생 후 모든 것을 제거하고 싶다.

<?php 
$uri = 'blah.blah.com?a=b&sortkey=year&sortval=asc'; 
$new_uri = preg_replace("/([^&]+)&(.*)/", "$1", $uri) 
?> 

패턴 :

([^&]+) : Match everything except '&' 
&  : First '&' 
(.*) : Any thing after that 

&의 첫번째 발생하기 전에 아무거나 첫 번째 그룹 ($1)로 대체되어이 같은 것을 사용할 수 있습니다.

0

기능을 사용하면 앰퍼샌드의 위치를 ​​찾을 수 있습니다. 그런 다음 substr 함수를 사용하여 해당 지점까지 URL 부분을 가져옵니다.

0

strpos가 작동하지만 RewriteRule을 사용하지 않는 한 $ _SERVER [ 'SCRIPT_NAME'] 또는 $ _SERVER [ 'PHP_SELF']로 충분할 것입니다.

URL을 다시 쓰는 경우 $ _SERVER [ 'REDIRECT_URL']이 (가) 더 적절합니다.

편집 : 나는 쿼리 문자열의 첫 번째 부분을 유지에 대한 비트를 놓친 :의

2

첫 번째 앰퍼샌드를 사용할 때까지 앰퍼샌드가 아닌 모든 항목을 간단하게 비교할 수 있습니다. 예 :

$incomingURI = 'http://www.example.com/?id=12&left=right&up=down'; 
preg_match('/[^&]+/', $incomingURI, $match); 
$outgoingURI = $match[0]; 

상기 코드는 변수 $ outgoingURI 출력는 다음의 것 :

http://www.example.com/?id=12 

는 preg_replace이다를 사용하는 것보다 훨씬 빠를 것이다.

+0

허용되는 대답이어야합니다. 하지만 당신은 정규식에 여분의'+'가 있습니다. – rvighne

+1

@rvighne 추가 '+'는 오타가 아닙니다. PHP에서 사용되는 PCRE에서 추가로'+'는 표현식을 소유로 만듭니다. 앰퍼샌드를 찾지 못하면 다시 찾지 않습니다. 이 코드를 다시 살펴보면 이제는 문자가 1 개만 찾고 작은 문자열이지만 double + 문법을 사용 했으므로 속도는 실제로 존재하지 않습니다. – joe92

관련 문제