webForumDet fria alternativet

Ta bort en del av querystring - preg_replace?

PHP

21 svar · 948 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Jag lyckas inte fixa det här med preg_replace...

En sträng (querystring):

$str = "?ett=blablabla&tva=blabla&tre=lalalala"

Nu vill jag kunna plocka bort valfri del av strängen, t.ex. "tva", på det här viset:

remove_part($str, "tva")

Vilket ska resultera i:

?ett=blablabla&tre=lalalala

Funktionen bör alltså se ut ungefär såhär:

function remove_part($str, $part)
{
   return preg_replace('/(\&|\?)$part(\&)/', '', $str);
}

Nu funkar ju inte ovan riktigt, men jag tror jag är på hyfsat rätt väg iaf. Snälla hjälp mig få preg_replace korrekt.

$part kan alltså vara den första delen i querystringen (inledas med ?) eller en senare del (inledas med &). Nästa dels & måste finnas kvar, och om den delen nu blir den fösta i querystringen ska den istället inledas med ?...

Exempel:

remove_part($str, "ett");
// Resulterar i "?tva=blabla&tre=lalalala"

Lite invecklat, men jag tror ni förstår hur jag menar.

Tack!

Medlem sedan nov. 200373 inlägg
#2

Det här funkar men är ju inte lika vackert som regexp :)

<?php
echo "<pre>";
$str = "?ett=blablabla&tva=blabla&tre=lalalala";
echo $str . PHP_EOL;
$str = trim($str, "?");
$parts = explode("&", $str);
$list = array();
foreach($parts as $part){
	list($key, $value) = explode("=", $part);
	$list[$key] = $key . "=" . $value;
}
unset($list["ett"]);
$str = sprintf("?%s", implode("&", $list));
echo $str . PHP_EOL;
die;
Medlem sedan jan. 20051 130 inlägg
#3

Hmm, mm, men jag vill gärna fixa det med preg_replace, känns snyggare. Måste ju gå!

Medlem sedan dec. 20025 483 inlägg
#4
function remove_part($str, $part)
{
   return preg_replace('/(?:$part=[^&]*&|&$part=[^&]*$)/', '', $str);
}
Medlem sedan apr. 2006409 inlägg
#5

pulse skrev:

Det här funkar men är ju inte lika vackert som regexp :)

@learn - Jag frågar mig, finns det ingen tjusigare sätt att skapa queryn från början i stället för att krångla till det med saker du ändå inte vet hur de fungerar?

Medlem sedan jan. 20051 130 inlägg
#6

Peter S, nej det där funkar inte riktigt...

$str = "?hej=fdfd&test=redkk&yttexsnn";
$part = "test";
$new_str = preg_replace('/(?:$part=[^&]*&|&$part=[^&]*$)/', '', $str);

echo $str;
echo "<br>";
echo $new_str;
echo "<br>";

Ger:

?hej=fdfd&test=redkk&yttexsnn
?hej=fdfd&test=redkk&yttexsnn

Det händer alltså inget med strängen.

überfuzz, nej det kan jag inte.

Medlem sedan dec. 20025 483 inlägg
#7

Hmpf, du lurade mig litet genom att antyda att man kunde ha variabler inuti apostrofsträngar ;) Men enligt http://se2.php.net/language.variables fungerar det tydligen inte. Så i stället kanske du kan skriva:

function remove_part($str, $part)
{
   return preg_replace('/(?:' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);
}
Medlem sedan apr. 2006409 inlägg
#8

learn skrev:

überfuzz, nej det kan jag inte.

Okej... men vi kanske kan som du förklarar vad du ska göra för något. Vad ska den här lösningen vara till för.

Medlem sedan jan. 20051 130 inlägg
#9

Peter, tack nu fungerar det! :bire

überfuzz, strängen är i praktiken en querstring och hämtas mha $_SERVER. Tack ändå.

Medlem sedan jan. 20051 130 inlägg
#10

Nej vänta nu.

Fel 1:

$str = "?test=blablabla";
$part = "test";
$new_str = preg_replace('/(?:' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);

resultat skrev:

?test=blablabla

Fel 2:

$str = "?test=blablabla&";
$part = "test";
$new_str = preg_replace('/(?:' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);

resultat skrev:

?

Strängen kan ju innehålla bara en del och därför inte innehålla tecknet &

Medlem sedan apr. 2006409 inlägg
#11

learn skrev:

Peter, tack nu fungerar det! :bire

überfuzz, strängen är i praktiken en querstring och hämtas mha $_SERVER. Tack ändå.

Vad i $_SERVER använder du som fråga till databasen? Vad vill du uppnå?

Medlem sedan dec. 20025 483 inlägg
#12
preg_replace('/(?:^[?]' . $part . '=.*?$|' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);
Medlem sedan jan. 20051 130 inlägg
#13

Nä, nu blev det lite konstigt.

$str = "?test=blablabla";
$part= "test";
$new_str = preg_replace('/(?:^?' . $part . '=.*?$|' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);

Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 4 in...

überfuzz, jag hämtar strängen mha $_SERVER["QUERY_STRING"], ingen db är inblandad.

Medlem sedan apr. 2006409 inlägg
#14

Men vet du inte vad du vill göra..?

Medlem sedan dec. 20025 483 inlägg
#15

Jag har uppdaterat mitt förra inlägg.

Medlem sedan jan. 20051 130 inlägg
#16

Peter S skrev:

Jag har uppdaterat mitt förra inlägg.

Funkar inte riktigt rätt nu heller.

$str = "?test=blablabla&test2=blablabla&test3";
$part = "test";
$new_str = preg_replace('/(?:^[?]' . $part . '=.*?$|' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);

tomt resultat skrev:

Den tar bort allt, även den andra och den tredje delen...

Resultat borde vara:

?test2=blablabla&test3

überfuzz skrev:

Men vet du inte vad du vill göra..?

Jo. Jag vill kunna ta en querystring och skapa en ny för att sedan använda i vanliga html-länkar.

Medlem sedan juli 20033 147 inlägg
#17

Det är ju för att test2 och test3 innehåller "test".

Medlem sedan jan. 20051 130 inlägg
#18

Melea skrev:

Det är ju för att test2 och test3 innehåller "test".

Nej. Samma tomma resultat för:

$str = "?test=blablabla&hej=blablabla&lalala"

Den matchar inte bara ordet i $part.

Medlem sedan juli 20033 147 inlägg
#19

Har du alltid tre querystrings? Annars är nog pulse:s lösning att föredra.

Medlem sedan jan. 20051 130 inlägg
#20

Det kan vara allt ifrån 0 till 100 delar/querystrings.

Varför är pulse:s lösning att föredra??

264 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)