L learn Medlem sedan jan. 2005 1 130 inlägg Frågan 15 dec. 2008 14:10 #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!
P pulse Medlem sedan nov. 2003 73 inlägg 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;
L learn Medlem sedan jan. 2005 1 130 inlägg Hmm, mm, men jag vill gärna fixa det med preg_replace, känns snyggare. Måste ju gå!
P Peter S Medlem sedan dec. 2002 5 483 inlägg function remove_part($str, $part)
{
return preg_replace('/(?:$part=[^&]*&|&$part=[^&]*$)/', '', $str);
}
Ü überfuzz Medlem sedan apr. 2006 409 inlägg
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?
L learn Medlem sedan jan. 2005 1 130 inlägg 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.
P Peter S Medlem sedan dec. 2002 5 483 inlägg 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);
}
Ü überfuzz Medlem sedan apr. 2006 409 inlägg
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.
L learn Medlem sedan jan. 2005 1 130 inlägg Peter, tack nu fungerar det! :bire
überfuzz, strängen är i praktiken en querstring och hämtas mha $_SERVER. Tack ändå.
L learn Medlem sedan jan. 2005 1 130 inlägg 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 &
Ü überfuzz Medlem sedan apr. 2006 409 inlägg
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å?
P Peter S Medlem sedan dec. 2002 5 483 inlägg preg_replace('/(?:^[?]' . $part . '=.*?$|' . $part . '=[^&]*&|&' . $part . '=[^&]*$)/', '', $str);
L learn Medlem sedan jan. 2005 1 130 inlägg 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.
Ü überfuzz Medlem sedan apr. 2006 409 inlägg Men vet du inte vad du vill göra..?
P Peter S Medlem sedan dec. 2002 5 483 inlägg Jag har uppdaterat mitt förra inlägg.
L learn Medlem sedan jan. 2005 1 130 inlägg
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.
M Melea Medlem sedan juli 2003 3 147 inlägg Det är ju för att test2 och test3 innehåller "test".
L learn Medlem sedan jan. 2005 1 130 inlägg
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.
M Melea Medlem sedan juli 2003 3 147 inlägg Har du alltid tre querystrings? Annars är nog pulse:s lösning att föredra.
L learn Medlem sedan jan. 2005 1 130 inlägg Det kan vara allt ifrån 0 till 100 delar/querystrings.
Varför är pulse:s lösning att föredra??