Avatar billede sjh Nybegynder
02. august 2004 - 01:10 Der er 26 kommentarer og
1 løsning

hastighed på switch case

Jeg har lavet et lille script til at erstatte æ, ø, å.. med æ, ø, å osv.. derfor ville jeg lige høre om der er en anden måde som er hurtigere end switch() og case ??

Jeg bruger Visual Basic til hverdags og der er Select Case det hurtigst, If .. Then er noget langsommer.


  $length = strlen($strHtml);
  for ($i=0; $i <= $length; $i++) {
    $strOne = substr($strHtml, $i, 1);
    switch ($strOne) {
      case "æ":
        $strOut .= "&aelig;";
        break;
      case "Æ":
        $strOut .= "&AElig;";
        break;
      case "ø":
        $strOut .= "&oslash;";
        break;
      case "Ø":
        $strOut .= "&Oslash;";
        break;
      case "å":
        $strOut .= "&aring;";
        break;
      case "Å":
        $strOut .= "&Aring;";
        break;
      default:
        $strOut .= $strOne;
    }
  }
  return $strOut;
Avatar billede googolplex Novice
02. august 2004 - 01:23 #1
$string = 'Din streng æøå ÆØÅ osv.';
$search = array('æ', 'Æ', 'ø', 'Ø', 'å', 'Å');
$replace = array('&aelig;', '&AElig;', '&oslash;', '&Oslash;', '&aring;', '&Aring;');
$new_string = str_replace($search, $replace, $string);
Avatar billede sjh Nybegynder
02. august 2004 - 01:27 #2
Ja den er fin.. men jeg skulle måske lige fortælle at den skal gøre noget andet under:

      default:
        $strOut .= $strOne;

så som at fjerne mellemrum osv...
Avatar billede sjh Nybegynder
02. august 2004 - 01:28 #3
derfor er jeg nødtil at løbe det hele igennem...
Avatar billede googolplex Novice
02. august 2004 - 01:32 #4
Så bør du bruge str_replace() først, derefter lave det andet. Jeg ville i hvert fald ikke bruge en switch til det, men er jo svært at komme med løsning når jeg ikke kender resten. Hvad skal der laves bagefter ?
Avatar billede googolplex Novice
02. august 2004 - 01:34 #5
Avatar billede sjh Nybegynder
02. august 2004 - 01:37 #6
den skal fjerne mellemrum og tab mellem > og <

jeg har prøvet lidt sjovt.. men det virker ikke :(

$strHtml = preg_replace("=\>(.*?)\<=is", '>'.trim('\1').'<', $strHtml);
Avatar billede sjh Nybegynder
02. august 2004 - 01:54 #7
Jeg kan godt se at din kode er meget hurtigere end min :) men havd gør jeg så med fjerne mellemrum mellem > og < ??
Avatar billede detox Nybegynder
02. august 2004 - 02:13 #8
Hvad med:

$replace = array('æ'=>'&aelig;','Æ'=>'&AElig;','ø'=>'&oslash;','Ø'=>'&Oslash;','å'=>'&aring;','Å'=>'&Aring;','>    <'=>'><','> <'=>'><');
$new_string = strtr($string, $replace);
Avatar billede roenving Novice
02. august 2004 - 02:18 #9
Generelt er Regular expressions lidt hurtigere, da de er grund-kodede, men jeg er ikke sikker på at det vil være tilfældet, når man skal lave en stribe erstatninger ...
Avatar billede sjh Nybegynder
02. august 2004 - 02:20 #10
Ja men der kan jo være lige fra 1 to 999999 mellemrum..
Avatar billede detox Nybegynder
02. august 2004 - 02:21 #11
Så prøv:

$replace = array('æ'=>'&aelig;','Æ'=>'&AElig;','ø'=>'&oslash;','Ø'=>'&Oslash;','å'=>'&aring;','Å'=>'&Aring;');
$string = strtr($string, $replace);
$new_string = preg_replace("/\>(.*)\</", "><", $string);
Avatar billede detox Nybegynder
02. august 2004 - 02:22 #12
Men hvis der er andre tegn imellem > og < dur den jo ikke.
Avatar billede sjh Nybegynder
02. august 2004 - 02:25 #13
nææ der kommer ikke noget ud af det :(
Avatar billede roenving Novice
02. august 2004 - 02:32 #14
Mellemrum og tab er ikke et problem, for de findes i regexp-special-tegnet \s, så de kan fjernes i eet hug !-)
Avatar billede sjh Nybegynder
02. august 2004 - 02:41 #15
Jeg har leget lidt med det.. og den viser 92490 mellem > og < ??? skulle det ikke være 32 som space??

  $strHtml = "<b>    </b>";

  echo preg_replace("=\>(.*?)\<=is", '>'.test('\1').'<', $strHtml);

  function test($strHtml) {
    for ($i=0; $i <= strlen($strHtml); $i++) {
      $strOut .= ord(substr($strHtml, $i, 1));
    }
    return $strOut;
  }
Avatar billede detox Nybegynder
02. august 2004 - 02:45 #16
Jo 32 og 9 for tab
Avatar billede sjh Nybegynder
02. august 2004 - 02:46 #17
ja men det er det altså ikke.. måske derfor trim ikke virker..
Avatar billede squashguy Nybegynder
02. august 2004 - 03:07 #18
preg_match_all("/>.*?</s", $strHtml, $all);

foreach($all as $m){
    $strHtml = str_replace($m, preg_replace("/\s/", "", $m), $strHtml);
}
Avatar billede sjh Nybegynder
02. august 2004 - 03:16 #19
Desværre.. den er meget langsom..

Jeg har fusked.. lidt men en.. den virker.. og den er noget hurtigere end den du lige kom med der..

    for ($i=0; $i <= 99; $i++) {
      $strSpace .= " ";
      $arrSearch[$i] = ">".$strSpace."<";
    }
    return str_replace($arrSearch, "><", $strHtml);
Avatar billede sjh Nybegynder
02. august 2004 - 14:53 #20
nu har jeg fået det til at virke.. men ikke uden jeres hjælp. :)
et lille problem nede ved -> # Her fjernes alle kommentar.

Er der ikke noget med at Perl og CGI Script også starter med <!-- noget --> ?


<?php
  function optimize($strHtml) {
    # Her fjernes linjeskift og tab + dansk (æ, ø, å osv..) bliver rettet til html tegn.
    $arrSearch = array("æ", "Æ", "ø", "Ø", "å", "Å", "\n", "\r", "\t");
    $arrReplace = array("&aelig;", "&AElig;", "&oslash;", "&Oslash;", "&aring;", "&Aring;", "", "", "");
    $strHtml = str_replace($arrSearch, $arrReplace, $strHtml);

    # Her erstatte vi 2 sammenhængende mellemrum, med 1 mellemrum i en løkke.
    while(strpos($strHtml, "  ")) {
      $strHtml = str_replace("  ", " ", $strHtml);
    }

    # Efter vi har erstatte mellemrum.. ville der være et mellemrum mellem
    # ">" og "<", det fjerenes her.
    $strHtml = str_replace("> <", "><", $strHtml);

    # Her fjernes alle kommentar.
    return preg_replace("=\<!--(.*?)\-->=is", "", $strHtml);
  }
?>
Avatar billede sjh Nybegynder
02. august 2004 - 15:02 #21
Jeg har testet en html-file på 276 kB den kunne optimeres til 168 kB på 0.007125 seconds med en 1300 MHz Duron :)
Avatar billede detox Nybegynder
02. august 2004 - 15:07 #22
Det er da ikke så ringe endda ;o)
Avatar billede detox Nybegynder
02. august 2004 - 15:12 #23
Kunne:

    while(strpos($strHtml, "  ")) {
      $strHtml = str_replace("  ", " ", $strHtml);
    }

ikke erstattes med:

$strHtml = preg_replace('=\s{2,}=', ' ', $strHtml);
Avatar billede sjh Nybegynder
02. august 2004 - 18:04 #24
hastighed er ca. det samme.. så jo den er da lidt smartere ;)
Avatar billede sjh Nybegynder
02. august 2004 - 18:13 #25
hastighed er ca. det samme.. så er den jo lidt smartere :D
Avatar billede sjh Nybegynder
02. august 2004 - 20:01 #26
når.. jeg tror jeg har fået svar på mit spørgsmål..

Jeg siger mange tak for en dejlig hjælp, fra jer..
Avatar billede sjh Nybegynder
02. august 2004 - 20:40 #27
Skal i lige se havd idén var med mit script :-)


Indtast denne stump kode i topen af din php-sider.

  <?php
    include("include.optimize.php");
    ob_start("optimize");
  ?>

Nu optimere den selv siden før den bliver sendt. ;-)
Man skan dog stoppe den ved at bruge denne kode:

  <?php ob_end_flush(); ?>

og der efter starte den igen med koden:

  <?php ob_start("optimize"); ?>

For at gøre det hele lidt nemmere, kan man smide style og javascript i en fil,
så behøver man ikke tænke på om der er noget som ikke må optimeres :-)

God fornøjelse...

------------ include.optimize.php ------------
<?php
  function optimize($strHtml) {
    # Her fjernes linjeskift og tab + dansk (æ, ø, å osv..) bliver rettet til entities tegn.
    $arrSearch = array("æ", "Æ", "ø", "Ø", "å", "Å", "\n", "\r", "\t");
    $arrReplace = array("&aelig;", "&AElig;", "&oslash;", "&Oslash;", "&aring;", "&Aring;", "", "", "");
    $strHtml = str_replace($arrSearch, $arrReplace, $strHtml);

    # Her erstatte vi 2 sammenhængende mellemrum, med 1 mellemrum
    $strHtml = preg_replace('=\s{2,}=', ' ', $strHtml);

    # Efter vi har erstatte mellemrum.. ville der være et mellemrum
    # mellem ">" og "<", det fjerenes her.
    $strHtml = str_replace("> <", "><", $strHtml);

    # Her fjernes alle kommentar.
    return preg_replace("=\<!--(.*?)\-->=is", "", $strHtml);
  }
?>
------------ include.optimize.php ------------
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