2010-12-14 7 views
4

어떻게 같은 쿼리 문자열을 다시 쓸 수있다 :아파치 재 작성 쿼리 문자열 (체크 박스 배열)

test.php?cat1[]=18&cat1[]=687&xxx[]=5&xxx[]=3&xxx[]=1&yyy[]=6 

매개 변수 (이름 및 값 쌍)을 동적으로 생성되는 것을

test.php?cat1=18,687,5&xxx=3,1&yyy=6 

참고 .

+1

그것은 절대적으로 가능합니다.하지만 mod_rewrite로하지는 않지만 PHP로 할 것입니다. – Gumbo

+0

나는 또한이 질문이있다 ... –

답변

8

다음은 원하는 쿼리 문자열을 만드는 간단한 PHP 스크립트입니다.

<?php 

$ret = ""; 
foreach($_GET as $key=>$val) { 
    if(is_array($val)) { 
    // Create the comma separated string 
    $value = $val[0]; 
    $length = count($val); 
    for($i=1; $i < $length; $i++) { 
     $value .= ',' . $val[$i]; 
    } 
    $ret .= "$key=$value&"; 
    } else { 
    $ret .= "$key=$val&"; 
    } 
} 

// Remove last '&' 
$ret = substr($ret , 0, strlen($ret)-1); 

// Redirect the browser 
header('HTTP/1.1 302 Moved'); 
header("Location: /test.php?" . $ret); 

?> 

당신이 /rewrite.php로 해당 스크립트를 저장 예를 들어, 당신이 요청을 라우팅 할 수있는 htaccess로 파일에서 이러한 규칙을 포함 할 경우 단순히 그 범위 밖에 있기 때문에 그것은, mod_rewrite를 사용하여이 부분을하지 않는 것이 좋습니다 /rewrite.php에 배열을 포함하는 쿼리 문자열 :

RewriteCond %{QUERY_STRING} \[\] 
RewriteRule ^test.php /rewrite.php [L,QSA] 

그런 다음 rewrite.php 스크립트는 쿼리 문자열을 다시 작성하고 연결된 쿼리 문자열을 사용하여 브라우저를 리디렉션합니다.

+0

내 맥락에서 나는 WordPress를 사용하고 있고, 당신의 예제에서 "test.php"는 "advanced-search"라는 페이지이다. (이것은 꽤 영구 링크가 이미 다시 작성되었다. htaccess) @ "http : // root/wordpress/advanced-search /"에 있습니다. 쿼리는 다음과 같이 나타납니다 : http : // root/wordpress/advanced-search/...; 작동하도록 스크립트에 필요한 조정이 있습니까? 감사합니다. –

+0

쿼리의 모양은 무엇입니까?/advanced-search/뒤에는 아무 것도 없습니다./wordpress/advanced-search /를 /rewrite.php (또는 원하는 이름은 무엇이든간에)로 다시 쓰고 싶다면 rewrite.php의 맨 아래에서, 'header() '를 사용하여 브라우저를 리디렉션하는 대신'pring (get_file_contents ("http : // your-host/wordpress/advanced-search? $ ret"));을 사용하십시오. –

+0

쿼리는 다음과 같습니다 : 10.0.1.4:8888 [/ slash] 고급 검색 [슬래시]? property_type [] = 로프트 & property_type [] = 주거 –

1

test.php CAT1는 = 18,687,5 & XXX = 3,1 & YYY = 코드 전에이 기능을 삽입 할 6

시도가 :

url_parsestring2array(& $_GET); 

function url_parsestring2array($args) 
{ 
    if (empty($args) || !is_array($args) || !$args) { 
     return; 
    } 
    foreach ($args as $key => $val) { 
     $tmp = explode(',', $val); 
     if (count($tmp) > 1) { 
      $args[$key] = $tmp; 
     } 
    } 
} 

var_dump($_GET); 

가 인쇄됩니다

array (3) {[ "cat1"] => 배열 (3) {[0] => 문자열 (2) "18"[1] => 문자열 (3) "687"[2] => string 1] "5"} [ "xxx"] => 배열 (2) {[0] => 문자열 (1) "3" [1] => 캐릭터 (1) "1"} "YYY"] => 캐릭터 (1) "6"}

3
if (preg_match('/[\][]/',$_SERVER['QUERY_STRING'])) { 
    foreach ($_GET as $key => &$val) { 
    $_GET[$key] = is_array($val) ? implode(',', $val) : $val; 
    } 
    header('Location: test.php?'.rawurldecode(http_build_query(array_filter($_GET)))); 
} 
+0

''/ [\] []/''을 고려하고 그것을 변경하는 경우에만'$ _GET [$ key]'에 할당하십시오; 당신은'foreach ($ _GET as $ key => & $ val)'을 가질 수도 있고'$ val'에 직접 할당 할 수 있기 때문에 배열은 복사되지 않습니다. 그렇지 않으면 잘 했어 (+1). – PointedEars

+0

@PointedEars : nice points, tnx ;-) 나는 빈 값을 제거하기 위해 뭔가를 추가했다. ;-) –

0

I 코드를 수정하지 않고이 변환을 수행 할 수있는 솔루션을 찾았습니다. (내 가상 호스트 섹션 단위)을 httpd.conf에서

나는 재 작성지도 정의 :

RewriteEngine On 

RewriteCond %{QUERY_STRING} (.*) 
RewriteRule ^(script.php) $1?${programmap:%1} [L] 

$ (1) 스탠드 :

RewriteMap programmap prg:/var/www/localhost/htdocs/chg.php 

은 그 다음의 .htaccess에서 나는 다음과 같은 규칙을 설정을 RewriteRule의 첫 번째 "()"에 대한 설명

% 1 RewriteCond의 첫 번째 "()"를 나타냅니다.

는 그럼 난 (PHP에 있지만, C, Perl로 할 수있다, 또는 whatelse)이 스크립트 "/var/www/localhost/htdocs/chg.php"를 쓰기 :

#!/usr/bin/php -f 
<?php 
$pos1 = 2; 
$pos2 = $pos1 + 1; 
$reg = '/(([a-z0-9_]+)\[\]=([^&]*))/'; 
while(true){ 
     $res=array(); 
     $buff = trim(fgets(STDIN)); 
     if(feof(STDIN)){ 
       break; 
     } 
     $r = preg_match_all($reg, $buff, $match,PREG_SET_ORDER); 
     if($r){ 
       foreach($match as $row){ 
         if(!isset($res[$row[$pos1]])){ 
           $res[$row[$pos1]] = $row[$pos1]."=".$row[$pos2]; 
         } else { 
           $res[$row[$pos1]] .= ",".$row[$pos2]; 
         } 
       } 
       $out=join('&',$res); 
     } else { 
       $out=$buff; 
     } 
     echo "$out\n"; 
}