Avatar billede fatass Nybegynder
17. maj 2003 - 18:57 Der er 21 kommentarer og
1 løsning

indsæt mellemrum efter hvert andet tegn

Hej

jeg har en tekststreng, hvor jeg skal have indsat et mellemrum efter hvert andet bogstav.

Eksempel:

"qwertyuiop"
=>
"qw er ty ui op"

jeg overvejer at tælle længden af strengen, lave en for-loop med substr(x, 2) og hver gang tilføje det, samt et mellemrum, til en ny streng.
Er det måden at gøre det på, eller er der en funktion der kan gøre det på en nemmere måde?
Avatar billede bromer Nybegynder
17. maj 2003 - 19:07 #1
Jeg ville tage længden af strengen og lave en løkke som du selv beskriver! Hvad pokker skal du dog bruge det til, hvis jeg må spørge!

/Rune
Avatar billede erikjacobsen Ekspert
17. maj 2003 - 19:18 #2
$str="hhuuyyiikkæ";
  preg_match_all('/..?/',$str,$m);
  print join(' ',$m[0]);
Avatar billede fatass Nybegynder
17. maj 2003 - 19:22 #3
Ja det må du da.
Til at gøre noget hex-data nemmere at læse. Nu ser det sådan her ud:
function opbryd($datastreng)
{
    for($i=0; $i<strlen($datastreng); $i++){
        $new_datastreng .= substr($datastreng, $i, 2)." ";
        $i++;
    }
}

Det virker fint. Men jeg trode bare at der måske var en nemmere måde. Man er jo altid på udkig efter nemmere måder at gøre tingene på ;)
Avatar billede fatass Nybegynder
17. maj 2003 - 19:33 #4
Tak for svaret. Jeg tænkte nok at der var en anden måde at gøre det på :)
Jeg vil lige teste hvad der er mest effektivt senere. Strengen kan nemlig godt være ret lang, så det er med at få den mindst krævende funktion.
Avatar billede erikjacobsen Ekspert
17. maj 2003 - 19:36 #5
Ja, det er interessant. Jeg kender ikke selv svaret.

Du måtte da gerne have ladet den stå - der kunne være andre måder ... :)
Avatar billede fatass Nybegynder
17. maj 2003 - 19:41 #6
Ja det har du egentlig ret i. Men det er der desværre ikke noget at gøre ved nu...

Jeg tester det først senere i aften/nat, for jeg er rykket videre i projektet og bøvler med andre problemer nu. Men jeg skal nok skrive hvad jeg kommer frem til :)
Avatar billede erikjacobsen Ekspert
17. maj 2003 - 19:41 #7
Hvis du kan acceptere et mellemrum til sidst er der jo

print preg_replace('/(..?)/','$1 ',$str);
Avatar billede roenving Novice
17. maj 2003 - 19:44 #8
Kunne en join være hurtigst ...
Avatar billede postndk Nybegynder
17. maj 2003 - 19:46 #9
erikjacobsen > den du skriver der kan du vel

print rtrim(preg_replace('/(..?)/','$1 ',$str));

kan man ikke ?
Avatar billede fatass Nybegynder
17. maj 2003 - 19:49 #10
Jeg vil egentlig helst undgå mellemrum til sidst, men hvis det er hurtigere kan man jo:

substr(preg_replace('/(..?)/','$1 ',$str), 0, -1);
Avatar billede erikjacobsen Ekspert
17. maj 2003 - 19:49 #11
Jo da - men så kan vi ligesågodt bygge det ind i det regulære udtryk

  print preg_replace('/(..?)(?=.)/','$0 ',$str);

Det koster sikkert en anelse mere, og netop i forbindelse med en
udskrift tænkte jeg det ikke gjorde noget med en blank *g*
Avatar billede postndk Nybegynder
17. maj 2003 - 19:54 #12
erikjacobsen > har du et godt link til regexp, hvor man kan lære det helt igennem
Avatar billede fatass Nybegynder
17. maj 2003 - 19:55 #13
Stengen skal både sendes til skærmen og, i nogle tilfælde, analyseres. Derfor vil jeg helst ikke have mellemrummet.
Avatar billede erikjacobsen Ekspert
17. maj 2003 - 19:59 #14
Prøv hvad der er mest effektivt. Jeg garantere ikke noget...
Jeg foretrækker blot regulære udtryk frem for while-løkker,
da jeg synes de er nemmere at forstå, men jeg er altså
også skruet lidt sjovt sammen oven i hovedet.

postndk: jeg kender ikke nogen "god" introduktion til
regulære udtryk. Men du kan jo starte på php.net/preg_replace
Avatar billede fatass Nybegynder
17. maj 2003 - 20:10 #15
Jeg tror i hvert fald at
substr(preg_replace('/(..?)/','$1 ',$str), 0, -1);
er hurtigere end
preg_replace('/(..?)(?=.)/','$0 ',$str);
da substr()'en skal udføres 1 gang. med den anden skal den udføre det hver gang.
Men jeg lader det komme an på prøve.

og hey hvad er der galt med at være skruet lidt sjovt sammen i hovedet? Det er da et stort aktiv. Et anderledes syn på sagen er ofte vejen til bedre måder at gøre tingene på.
Avatar billede schaefner Juniormester
17. maj 2003 - 21:26 #16
postndk >> Du kan måske få lidt ud af dette link: http://www.phpbuilder.com/columns/dario19990616.php3
Avatar billede fatass Nybegynder
18. maj 2003 - 14:52 #17
Så har jeg fået testet det. Her er hvad jeg kom frem til:

Antal udførelser:
1000 gange

Antal tegn i test streng:
1000

Test 1 preg_match_all
Udførelsestid:
1.32230 sekunder!

Test 2 for-loop med substr
Udførelsestid:
1.88068 sekunder!

Test 3 preg_replace
Udførelsestid:
0.28100 sekunder!

Test 4 preg_replace, med rtrim
Udførelsestid:
0.28690 sekunder!

Test 5 preg_replace, som fjerner mellemrum til sidst
Udførelsestid:
0.33234 sekunder!

Konklusionen er altså, at for-loopen er den mindst effektive og at preg_replace med rtrim render med sejeren.
Avatar billede fatass Nybegynder
18. maj 2003 - 14:56 #18
Det er udført på en windows xp maskine med apache 1.3.27 og php 4.3.1.
Om resultatet er anderledes på et andet os eller andre versioner af serversoftware og phpversion ved jeg ikke...
Avatar billede fatass Nybegynder
18. maj 2003 - 14:56 #19
Her er scriptet jeg testede det med:

<?php
$antal = 1000;
$str = "indsæt test-streng her";
$antaltegn = strlen($str);

echo "
Antal udførelser:<br>
$antal gange<br>
<br>
Antal tegn i test streng:<br>
$antaltegn<br>
<br>
";


echo "<b>Test 1</b> preg_match_all<br>";
$start = getmicrotime();
for ($i=0; $i<$antal; $i++){
    $test = '';
    preg_match_all('/..?/',$str,$m);
    $test = join(' ',$m[0]);
}
$end = getmicrotime();
$time = $end - $start;
$time = substr($time,0,7);
echo "
Udførelsestid:<br>
$time sekunder!<br>
<br>
";



echo "<b>Test 2</b> for-loop med substr<br>";
$start = getmicrotime();
for ($i=0; $i<$antal; $i++){
    $new_datastreng = '';
    for($j=0; $j<strlen($str); $j++){
        $new_datastreng .= substr($str, $j, 2)." ";
        $j++;
    }
}
$end = getmicrotime();
$time = $end - $start;
$time = substr($time,0,7);
echo "
Udførelsestid:<br>
$time sekunder!<br>
<br>
";



echo "<b>Test 3</b> preg_replace<br>";
$start = getmicrotime();
for ($i=0; $i<$antal; $i++){
    $test = '';
    $test = preg_replace('/(..?)/','$1 ',$str);
}
$end = getmicrotime();
$time = $end - $start;
$time = substr($time,0,7);
echo "
Udførelsestid:<br>
$time sekunder!<br>
<br>
";


echo "<b>Test 4</b> preg_replace, med rtrim<br>";
$start = getmicrotime();
for ($i=0; $i<$antal; $i++){
    $test = '';
    $test = rtrim(preg_replace('/(..?)/','$1 ',$str));
}
$end = getmicrotime();
$time = $end - $start;
$time = substr($time,0,7);
echo "
Udførelsestid:<br>
$time sekunder!<br>
<br>
";


echo "<b>Test 5</b> preg_replace, som fjerner mellemrum til sidst<br>";
$start = getmicrotime();
for ($i=0; $i<$antal; $i++){
    $test = '';
    $test = preg_replace('/(..?)(?=.)/','$0 ',$str);
}
$end = getmicrotime();
$time = $end - $start;
$time = substr($time,0,7);
echo "
Udførelsestid:<br>
$time sekunder!<br>
<br>
";


function getmicrotime()
{
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

?>
Avatar billede erikjacobsen Ekspert
18. maj 2003 - 21:33 #20
Og konklusionen er vel også, at det måske ikke er det
billigste, men næsten, at skrive ét godt regulært udtryk.

Sikke grundig du er.
Avatar billede roenving Novice
18. maj 2003 - 22:03 #21
-- à propos erik

-- kender du een (eller to) gode ressourcer omkring reg.exp.

jes
Avatar billede erikjacobsen Ekspert
18. maj 2003 - 22:06 #22
Nej - det gør jeg ikke. Der er mange små artikler
og ting på nettet (vink: google), og der er også
skrevet en bog kun om det.
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