Avatar billede ferdinand Nybegynder
26. februar 2002 - 00:45 Der er 34 kommentarer og
1 løsning

Erstatte et bogstav med et andet

Hvis jeg har en variabel med en lille text i, hvordan kan jeg så erstatte alle forekomster af bogstavet f med bogstavet k?
I det textstykke er der også nogle links (altså <a href="http://blablabla.dk">Klik her</a>). Der skal ikke erstattes bogstaver i url'en, men det skal der i den text der er klikbar ('Klik mig' i eksemplet).
Avatar billede invisibleman Nybegynder
26. februar 2002 - 00:48 #1
$minvar = str_replace("f", "k", $minvar);
Avatar billede invisibleman Nybegynder
26. februar 2002 - 00:48 #2
Nååe .. kun i det klikbare ... den er straks værre .. der skal du ha' fat i noget regexp ..
Avatar billede ferdinand Nybegynder
26. februar 2002 - 00:49 #3
Jeg havde selv lavet den med str_replace, men opdagede at mine links så ret uheldige ud.
Avatar billede tipsen Nybegynder
26. februar 2002 - 01:11 #4
Jeg undrer mig lidt over det der skal udføres, men hvis det er kravet, kan nedenstående funktion klare det...

function test($tekst, $a, $b) {
    $start = strpos($tekst, ">");
    $slut = strpos($tekst, "<", $start);
    $tmp1 = substr($tekst,0,$start+1);
    $tmp2 = str_replace($a, $b, substr($tekst,$start+1,$slut-$start-1));
    $tmp3 = substr($tekst,$slut);
    return $tmp1.$tmp2.$tmp3;
}

$tekst = "<a href=\"http://blablabla.dk\">Klik her</a>";
$prechar = "K";
$postchar = "S";

echo test($tekst, $prechar, $postchar);

--tipsen--

PS: På nuværende tidspunkt erstattes "K" med "S" - det var lidt sjovere i den tekst.... ;-)
Avatar billede ferdinand Nybegynder
26. februar 2002 - 01:25 #5
Jeg har nok ikke beskrevet det tydeligt nok.

Hvis jeg har
$tekst = "En mand fandt en tøffel og en <a href="http://giraffer.dk">giraf</a> der hed f";
hvordan kan jeg så få den til at blive til:
$tekst = "En mand kandt en tøkkel og en <a href="http://giraffer.dk">girak</a> der hed k";
Avatar billede tipsen Nybegynder
26. februar 2002 - 01:39 #6
dvs der må overhovedet ikke ændres tegn, som står i <tags> ?
Avatar billede ferdinand Nybegynder
26. februar 2002 - 01:45 #7
Præcist!
Avatar billede tipsen Nybegynder
26. februar 2002 - 01:50 #8
Så laver man da bare det i stedet....

function test2($tekst, $a, $b) {
  $i=0;
  $ChangeAllowed=True;
  $tekstlen = strlen($tekst);
  while ($i < $tekstlen) {
    if ($tekst[$i] == "<") {
      $ChangeAllowed = False;
    }
    else if ($tekst[$i] == ">") {
      $ChangeAllowed = True;
    }
    else if ($ChangeAllowed && $tekst[$i] == $a) {
      $tekst[$i] = $b;
    }
    $i++;
  }
  return $tekst;
}

$tekst = "En mand fandt en tøffel og en <a href=\"http://giraffer.dk\">giraf</a> der hed f";

$prechar = "f";
$postchar = "k";

echo test2($tekst, $prechar, $postchar);
Avatar billede tipsen Nybegynder
26. februar 2002 - 01:52 #9
bemærk, at jeg har escapet anførselstegn i forsøgsteksten - ellers fungerer det selvsage ikke...
Avatar billede tipsen Nybegynder
26. februar 2002 - 01:52 #10
det kan laves smartere og hurtigere, men jeg er træt og sengen kalder...
Avatar billede ferdinand Nybegynder
26. februar 2002 - 01:58 #11
Og nu for at være urimelig: Kan man også gøre det sådan så at man kan indsætte feks to bogstaver istedet for ét? Så 'f' bliver til 'kg'?
Avatar billede invisibleman Nybegynder
26. februar 2002 - 01:59 #12
Jeg arbejder på en løsning der vil være lidt mere flexibel ..
Avatar billede tipsen Nybegynder
26. februar 2002 - 02:02 #13
hvis du havde skrevet præcist hvad du havde brug for, til at starte med, havde det været færdigt nu... - men nu vil jeg så smutte til køjs i stedet... - det lyder mere og mere som regular expressions...
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:05 #14
Jeg er lige ved at have den ...
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:05 #15
tipsen: en regexp til den her er svær ..
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:05 #16
PS. Desuden forstod jeg godt hvad han ville have ..
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:12 #17
Denne her kan erstatte ligeså mange tegn med ligeså mange tegn du har lyst til, uden at den ødelægger links/tags.

----------------------------------------------
<pre>
<?php
    function replace_inlinktext($text, $fromchar, $tochar) {
        while (!$break) {
            $index = strpos($text, "<");
            if ($index === false) break;

            $str = substr($text, 0, $index);
            $out .= str_replace($fromchar, $tochar, $str);

            $endindex = strpos($text, ">", ++$index);
            if ($endindex === false) break;

            $out .= substr($text, --$index, (++$endindex) - $index);
            $text = substr($text, $endindex);
        }

        return $out . $text;
    }

    $text = "Dette er en test :o) <a href=\"http://www.eksperten.dk/\">Klik her</a> og se hvad vi har at byde på. Måske vil du også kunne lide <a href=\"http://www.invisibleman.dk/\">siden her</a> :D";
    echo "<b>Original text:</b>\n" . $text . "\n\n";
    echo "<b>Replaced text:</b>\n" . replace_inlinktext($text, "s", "ZX");
?>
</pre>
----------------------------------------------
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:12 #18
Svar, og det var så mit foreslag
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:14 #19
I tilfælde af, at Eksperten har fucket noget af koden kan du hente den her:

http://files.novaishot.dk/177757_replace_linktext.php
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:18 #20
Hent filen fra linket der ... der var nogle slemme "slamkode" fejl i ...  som er væk nu
Avatar billede ferdinand Nybegynder
26. februar 2002 - 02:58 #21
Jeg takker og bukker
Avatar billede invisibleman Nybegynder
26. februar 2002 - 02:59 #22
Det var så lidt :)
Avatar billede tipsen Nybegynder
26. februar 2002 - 11:00 #23
invisibleman: Jeg indrømmer, at min første udgave ikke opfyldte hvad der stod i spørgsmålet, men det gjorde den anden - så det var godt klaret at du forstod, hvad han ville have...

BTW: Prøv evt. din funktion med   

$text = "Dette er også en test - den er ikke så lang, men uden url'er...";

...en mindre fejl - men ellers en pæn funktion!
Avatar billede tipsen Nybegynder
26. februar 2002 - 11:03 #24
invisibleman: mht. regexp'en tror jeg godt det kan lade sig gøre - den skal bare ikke erstatte text i "<....>" og jeg mener der er en negationsoperator til brug i regular expressions - så burde det da være relativt nemt...
Avatar billede invisibleman Nybegynder
26. februar 2002 - 23:19 #25
tipsen: Det var nu ikke så meget et spørgsmål om at forstå spørgsmålet, mere et spørgsmål om at tænke fremad. Jeg går altid ud fra at folk vil have en funktion der kan "mest", dvs. i det her tilfælde at den kunne klare flere <a href..>'s i samme streng.

Jeg har kun testet med strenge MED tags, så det kan sagtens være der er en fejl hvis der ingen er ... den må jeg lige få rettet :-)

Hmm .. jeg sad og legede med en regexp (Perl PCRE comp./preg_replace()) men synes ikke jeg kunne finde ud af lave en regexp der kunne replace uden om < og >.
Avatar billede invisibleman Nybegynder
26. februar 2002 - 23:23 #26
Så er den klaret ... forøvrigt forårsagede den fejl at tekst efter den sidste > ikke ville gennemgå str_replace()'en.

http://files.novaishot.dk/177757_replace_linktext.php

Er den nye og fixede :o)
Avatar billede tipsen Nybegynder
27. februar 2002 - 00:21 #27
Mht. at forstå spørgsmålet og løse opgaven tænker jeg mere på at optimere udførslen, så der ikke bruges mere tid end højst nødvendigt - så derfor laver jeg præcist, hvad der spørges efter og helst på den mest effektive måde - vel at mærke ud fra den viden jeg på nuværende tidspunkt besidder om php... - det kan nok altid laves lidt hurtigere, hvis man har bedre styr på sproget...

Når man selv programmerer, har man overblik over opgaven og kan se, hvornår det kunne være smart at generalisere kode og, hvornår det er tilstrækkeligt med noget som kun kan løse en specifik problemstilling.

Men btw syntes jeg det var en "pæn" funktion du lavede!
Avatar billede invisibleman Nybegynder
27. februar 2002 - 00:25 #28
Klart, klart ... men "I det textstykke er der også nogle links" altså .. jeg lærte i sin tid at "links" var flertal .. ? *G* det var sårn det der gav mig et hint om at der kunne være flere :o)

OG så synes jeg forøvrigt at en bunke substr() er sjusk .. *G* det er så lidt flexibelt som noget kan være, men nok om det :)
Avatar billede tipsen Nybegynder
27. februar 2002 - 03:09 #29
Jvf. min tidligere kommentar er vi stadig enige om at min første udgave var forkert:

"invisibleman: Jeg indrømmer, at min første udgave ikke opfyldte hvad der stod i spørgsmålet, men det gjorde den anden..." (og at den desuden ikke var særlig pæn...)

Men den anden udgave af programmet, kan da ikke udføre opgaven meget mere effektivt? Du kan kun gennemsøge tekstrengen lineært, så selvom du benytter de indbyggede funktioner, skal du alligevel gennem alle tegnene et efter et... - det er hurtigere end at bruge substr, strpos, str_replace... - men; nej, ikke så fleksibelt...

Men det er vel grundlæggende et spørgsmål om man vil have effektivitet eller fleksibilet - og det findes der vist ikke et overordnet svar på - det afhænger af konteksten.

--tipsen--
Avatar billede invisibleman Nybegynder
27. februar 2002 - 15:03 #30
Du vil altså påstå at det er hurtigere at gå strengen igennem tegn for tegn, end at bruge strpos(), substr() og str_replace() ? Det tvivler jeg nu stærkt på ..
Avatar billede tipsen Nybegynder
27. februar 2002 - 15:51 #31
hvordan tror du strpos finder det tegn du beder om?

Det er ikke magi... - den går også strengen igennem tegn for tegn!
Avatar billede invisibleman Nybegynder
27. februar 2002 - 15:58 #32
strpos() er lavet i C++, den er MEGET hurtigere end PHP er til at finde det tegn for tegn .. tænkt på det.
Avatar billede tipsen Nybegynder
27. februar 2002 - 16:47 #33
strpos() er faktisk kodet i ren C for at være præcis og du har ret i at det væsentligt hurtigere end php, men du skal også tage højde for, at du bruger forskellige streng-funktioner 6 gange i din funktion og at disse funktioner er bygget til at tage for alle mulige fejl, så de tager højde for nogle tilfælde der ikke vil opstå her. Desuden tager det også tid at kalde funktionerne!

Jeg ved ærligt talt ikke hvad der er hurtigst, men vi kan da lave en lille speedtest ;-)
Avatar billede invisibleman Nybegynder
27. februar 2002 - 16:53 #34
Bla bla .. det er ren ordkløver det her ... lav gerne en test, jeg er egentligt lidt ligeglad. Jeg VED at det ikke er hurtigere at løbe strengen igennem tegn for tegn .. det har det aldrig været.
Avatar billede tipsen Nybegynder
27. februar 2002 - 16:58 #35
hmm - prøv at kaste et blik på sourcekoden til funktionerne - så kan du se, at det er måden at gøre det på - der findes ikke magi i programmering...
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