2010-07-22 12 views
6

Używam $_SERVER['QUERY_STRING'], aby uzyskać żądań zapytania.Zastępowanie określonej części ciągu zapytania PHP

przykładem byłoby a=123&b=456&c=789

Jak można usunąć wartość B z łańcucha zapytania w celu uzyskania a=123&c=789 gdzie B może być dowolną wartość odpowiednią długość oraz jest alfanumeryczne.

Wszelkie pomysły doceniane, dzięki.

+0

SO rock, ale nie jesteś. ponieważ zaakceptowałeś rozwiązanie, które nie zastąpi wielu rodzajów danych. –

+0

@ Col. Shrapnel: Jakiego rodzaju danych rozwiązanie nie byłoby w stanie zastąpić? OP mógłby wówczas być zainteresowany przypadkiem, w którym parametry zapytania zawierają tylko liczby (jak podano w przykładowym zapytaniu); w takim przypadku proponowane rozwiązanie zadziałałoby. – kiamlaluno

+0

@kiamlaluno cóż, jeśli weźmiesz tę stronę jako "odpowiedzmy na każde lame pytanie i zapomnij" to jest o.k. Ale ktoś myśli o tej stronie jako ostatecznym źródle wiedzy, gdzie odpowiedzi mogą być używane więcej niż raz. –

Odpowiedz

5

Wartość jest będzie $_GET['b'].

Jak o:

str_replace('&b='.$_GET['b'], '', $_SERVER['QUERY_STRING']); 
+0

Podoba mi się ten. Dziękuję Ci. – pondpad

+0

To rozwiązanie nie działa, jeśli wartość zawiera znaki, które należy zakodować. Zobacz komentarz pułkownika Shrapnel w komentarzach do mojej odpowiedzi (patrz http://stackoverflow.com/questions/3308711#comment-3428781) na przykład. – Gumbo

+0

Ah, tak. Ale możesz to naprawić, zawijając $ _GET ['b'] w stylu dekodowania. – Rimian

1

Wystarczy zrobić zmienną używając $_GET i uwzględniają b ciąg kwerendy w procesie produkcji:

$query_string_new = 'a=' . urlencode($_GET['a']) . '&c=' . urlencode($_GET['c']); 

$query_string_new powinien zawierać a=123&c=789

+1

Nie zapomnij o prawidłowym wyjściu z wyjścia. – Gumbo

+0

@Gumbo: Oczywiście, dzięki. – Sarfraz

+0

A co jeśli * a * i * c * nie są wartościami dziesiętnymi? – Gumbo

3

Spróbuj tego:

$query_new = preg_replace('/(^|&)b=[^&]*/', '', $query); 
+1

Jaki jest powód głosowania w dół? I proszę nie mówić "Och, używasz wyrażeń regularnych! Jak źle! " – Gumbo

+0

Użycie wyrażenia regularnego pozwoliłoby na zastąpienie parametru dowolną pozycją w łańcuchu zapytania. 'str_replace ('& b ='. $ _ GET ['b'], '', $ _SERVER ['QUERY_STRING'])' nie zastępuje go, jeśli jest pierwszym parametrem w ciągu zapytania. – kiamlaluno

+0

@kiamlaluno: Dokładnie. Dlatego wybrałem wyszukiwanie wyrażenia regularnego. – Gumbo

13

Roztwór stosując url parsowania:

parse_str($_SERVER['QUERY_STRING'], $result_array); 
unset($result_array['b']); 
$_SERVER['QUERY_STRING'] = http_build_query($result_array); 
+0

Coś takiego, zdecydowanie. Być może będziesz w stanie użyć istniejącego '$ _GET' zamiast wykonywać początkowe' parse_str() ':' unset ($ _ GET ['b']); $ qs = http_build_query ($ _ GET); ' –

+0

Różnica polega na tym, że moja odpowiedź ma wpływ tylko na zmienną' $ _SERVER ['QUERY_STRING'] 'i pozostawia nietkniętą wartość $ _GET, na wypadek gdyby nadal była potrzebna z jakiegoś powodu. – SirDarius

2

Wszystkie odpowiedzi wygląda dobrze, ale będzie bardziej elastyczny, jeśli nie:

// Make a copy of $_GET to keep the original data 
$getCopy = $_GET; 
unset($getCopy['b']); // or whatever var you want to take out 

// This is your cleaned array 
var_dump($getCopy); 

// If you need the URL-encoded string, just use http_build_query() 
$encodedString = http_build_query($getCopy); 
+0

W PHP 5.3 '$ getCopy = $ _GET' nie tworzy kopii, ale tworzy odwołanie do' $ _GET'. Miałem ten sam problem w moim kodzie, w którym chciałem zachować wartość '$ _GET', która została użyta dla innej funkcji; Użyłem '$ query = $ _GET; unset ($ query ['q']; ', a wynik był taki, że również druga funkcja (która miała bezpośredni dostęp do' $ _GET') nie była w stanie pobrać '$ _GET ['q']'. – kiamlaluno

+0

Do tej pory jak wiem, aby utworzyć odniesienie, musisz wykonać '$ getCopy = & $ _GET' ... – eillarra

+0

@ilarra: To prawda, tylko obiekty są przekazywane przez odniesienie, w PHP 5.3. Nie mogę wtedy uogólnić kodu, który zgłosiłem , mimo że zastąpienie '$ query = $ _GET; unset ($ query ['q'];' z pętlą rozwiązało problem występujący w moim kodzie – kiamlaluno

1

możesz użyć tej funkcji:

function Remove_QS_Key($url, $key) { 
$url = preg_replace('/(?:&|(\?))'.$key.'=[^&]*(?(1)&|)?/i', "$1", $url); 
return $url; 
} 

aby usunąć dowolny klucz, np.

echo Remove_QS_Key("http://domain.com/?a=b&ref=dusername&c=d&e=f&g=h", "ref"); 

wynik

http://www.domain.com/?a=b&c=d&e=f&g=h 
+0

Czy to jest lepsze niż zaakceptowana odpowiedź? – Oren

Powiązane problemy