webForumDet fria alternativet

Ta bort en del av querystring - preg_replace?

21 svar · 948 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#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!

pulseMedlem 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;
learnMedlem 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å!

Peter SMedlem sedan dec. 20025 483 inlägg
#4
function remove_part($str, $part)
{
   return preg_replace('/(?:$part=[^&]*&|&$part=[^&]*$)/', '', $str);
}
überfuzzMedlem 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?

learnMedlem 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.

Peter SMedlem 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);
}
überfuzzMedlem 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.

learnMedlem 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å.

learnMedlem 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 &

überfuzzMedlem 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å?

Peter SMedlem sedan dec. 20025 483 inlägg
#12
preg_replace('/(?:^[?]' . $part . '=.*?$|' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);
learnMedlem 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.

überfuzzMedlem sedan apr. 2006409 inlägg
#14

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

Peter SMedlem sedan dec. 20025 483 inlägg
#15

Jag har uppdaterat mitt förra inlägg.

learnMedlem 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.

MeleaMedlem sedan juli 20033 147 inlägg
#17

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

learnMedlem 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.

MeleaMedlem sedan juli 20033 147 inlägg
#19

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

learnMedlem 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??

129 ms totalt · 3 externa anrop · v20260731065814-full.b943c234
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)