Avatar billede blod_1 Nybegynder
30. januar 2011 - 21:59 Der er 11 kommentarer og
1 løsning

Optimering af replace

Jeg har lavet en funktion til mit php sådan så den kan replace tekst med noget andet.

    $tempin = $input;
    while(strlen($tempin))
    {
        $option = "custom";
        $optionlen = strlen($option)+1;
        $next = strpos($tempin, "%" . $option . "=");
        if (!$next) $tempin = "";
        $tempin = substr($tempin, $next+1);
        $stop = strpos($tempin, "%");
        $cust = substr($tempin, $optionlen, $stop-$optionlen);
        if (strpos($input, "%" . $option . "=" . $cust . "%") > -1) $input = str_replace("%" . $option . "=" . $cust . "%", $_GET[$cust], $input);
    }

Her har jeg det til at replace %custom=variabel% med ?variabel=ny-tekst-istedet

men er der en bedre måde at gøre dette på? Samtidig har jeg også et problem med når %custom= står som det første i $input, lige så snart der kommer et tegn foran, så virker det efter hensigten igen.
Avatar billede Fnugus Nybegynder
30. januar 2011 - 22:21 #1
Evt dette vil være nemmere:

$format = array(
    "custom1" => "ny1",
    "custom2" => "ny2");

function formatText(&$text,$change)
{
    $text = strtr($text, $change);
    return $text;
}

$string = "Jeg kender custom1 og custom2";
echo formatText($string,$format); // Vil outputte "Jeg kender ny1 og ny2"
Avatar billede blod_1 Nybegynder
30. januar 2011 - 22:26 #2
Men det gør vist ikke det samme?

det kan jo være f.eks
Han hedder %custom=navn%, han har nummer %custom=nummer%, og er %custom=alder% år

hvor jeg så kan kalde ?navn=benny&nummer=7913&alder=42

Resultatet ville så være "Han hedder benny, han har nummer 7913, og er 42 år"
Avatar billede Fnugus Nybegynder
30. januar 2011 - 22:52 #3
Hvis vi antager, at du kender variablerne $navn, $nummer, $alder (evt. via en $navn = $_GET['navn']; osv.), kan den sættes op som:

$navn = $_GET["navn"];
$nummer = $_GET["nummer"];
$alder = $_GET["alder"];

$format = array();
$format["%custom=navn%"] = $navn;
$format["%custom=nummer%"] = $nummer;
$format["%custom=alder%"] = $alder;

function formatText(&$text,$change)
{
    $text = strtr($text, $change);
    return $text;
}

$str = "Han hedder %custom=navn%, han har nummer %custom=nummer%, og er %custom=alder% år"
echo formatText($str);

// Ville outputte ""Han hedder benny, han har nummer 7913, og er 42 år"
Avatar billede blod_1 Nybegynder
30. januar 2011 - 22:58 #4
Men det gør jeg jo ikke.

%custom=variabel%

"variabel" er bruger defineret, og kan derfor være hvad som helst.

Det er også derfor at jeg leder efter %custom= og så finder hvornår der kommer et % igen for at afslutte den, og så kigger hvad der er imellem %custom= og %. På den måde ved jeg så hvad jeg skal kigge efter med $_GET[];

Kan være det er lidt svært at gennemskue ud fra koden hvad det faktisk er jeg gør med det, men netop derfor jeg gerne ville have det optimeret til noget som gjorde det mere overskueligt og meget gerne få det til at fungere bedre. Det fungerer som det er pt, men ikke når %custom= er det første i $input
Avatar billede Fnugus Nybegynder
30. januar 2011 - 23:02 #5
Man kunne også udvide den lidt:

$format = array();
  // Dette bygger array'et ud fra hvilket $_GET[$key] du kan få fat i fra linket.
foreach($_GET as $key => $value)
{
  $format_key = "%custom=" . $key . "%";
  $format[$key] = $value;
}

function formatText(&$text,$change)
{
    $text = strtr($text, $change);
    return $text;
}

Men at vende den om så den leder teksten igennem først og derefter kigger på $_GET, så kan det nok ikke gøres meget nemmere end det du har gjort. Beklager jeg ikke har været helt så god til at hjælpe.
Avatar billede Fnugus Nybegynder
30. januar 2011 - 23:08 #6
Eller måske kan det gøres således:


$brugerens_tekst = "Obskur lang tekststreng med masser af %custom=snuff%";

$format = array();
$array = explode("%custom=",$brugerens_tekst);
for($i = 0; $i < count($array); $i++)
{
  $var_array = explode("%",$array[$i])
  $item = $_GET[$var_array[0]];
  $format["%custom=".$item."%"] = $_GET[$item];
}

function formatText(&$text,$change)
{
    $text = strtr($text, $change);
    return $text;
}
Avatar billede Fnugus Nybegynder
30. januar 2011 - 23:10 #7
Rettelse:

for($i = 0; $i < count($array); $i++)
{
  $var_array = explode("%",$array[$i])
  $item = $var_array[0]; // værdien mellem %custom= og %
  $var = $_GET[$item];
  $format["%custom=".$item."%"] = $_GET[$item];
}
Avatar billede blod_1 Nybegynder
30. januar 2011 - 23:21 #8
Hov, det gav mig en ide!

foreach($_GET as $key => $value)
{
    $input = str_replace("%custom=" . $key . "%", $_GET[$key], $input);
}

Ville det ikke være lige så godt at gøre? Eller er der en ulempe ved det? (er stadig igang med at lære php :P)
Avatar billede Fnugus Nybegynder
30. januar 2011 - 23:35 #9
Jah du bygger dine replace's på de ting du finder i dit link og ikke den anden vej rundt. Du søger dit link igennem for variabler og replacer ud fra det, hvor at du gav udtryk for at du ville søge teksten for variabler der skulle hentes. Men det er en lige så god måde at gøre det på.
Avatar billede blod_1 Nybegynder
30. januar 2011 - 23:37 #10
Hvordan det skulle gøres er egentligt lidt lige meget, bare det rigtige sker i sidste ende, og det gør det med det sidste jeg forsøgte.

Ved så bare ikke om det er en dum måde at gøre det på, der er jo også en del af de $_GET som ikke har noget med det at gøre, selv om det nok betyder så lidt at man ikke opdager det.
Avatar billede HBP2 Praktikant
31. januar 2011 - 14:16 #11
Der er kommet forslag til løsninger, så det vil jeg ikke brug tid på.
Men du skrev at du havde et problem med hvis "%custom=" stod i starten af $input - så virker det ikke. Det skyldes at du tester om resultatet af  strpos()  er <> 0.
Hvis "%custom=" står i starten, så vil  strpos()  returnere 0; hvis "%custom=" slet ikke findes, så returnerer  strpos()  NULL. Ingen af delene er <> 0 sådan som du tester det.
Avatar billede blod_1 Nybegynder
31. januar 2011 - 15:38 #12
"Det skyldes at du tester om resultatet af  strpos()  er <> 0."
Det gør jeg da ikke?

Jeg tester da om strpos() er > -1, altså 0 eller over. Så hvis den returnerede 0, så ville den da stadig blive godkendt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester