Avatar billede kennith Nybegynder
09. februar 2012 - 14:36 Der er 17 kommentarer og
2 løsninger

Sammenlægge str_replace

Jeg har nedenstående kode som ikke er særlig elegant er der en der kan vise mig hvordan jeg laver det noget smartere

      $string = str_replace('æ', 'ae', $string);
      $string = str_replace('ø', 'oe', $string);
      $string = str_replace('å', 'aa', $string);
      $string = str_replace('Æ', 'ae', $string);
      $string = str_replace('Ø', 'oe', $string);
      $string = str_replace('Å', 'aa', $string);

Formået med koden er som det kan ses at erstatte æ,ø og å i en streng men jeg tænker det må kunne skrives pænere jeg vil også gerne tilføje flere ting der skal omskrives.
Avatar billede rix Praktikant
09. februar 2012 - 14:42 #1
$ikke_god = array(
'æ'
'ø'
'å'
'Æ'
'Ø'
'Å'
);

$god = array(
'ae'
'oe'
'aa'
'ae'
'oe'
'aa'
);
$string = str_replace($ikke_god, $god, $string);
09. februar 2012 - 14:47 #2
Hvad med dette:

$old = array('æ', 'ø', 'å');
$new = array('ae', 'oe', 'aa');
$string = str_replace($old, $new, $string);

http://php.net/manual/en/function.str-replace.php
09. februar 2012 - 14:48 #3
Det var rix17172 hurtigere med mens jeg arbejde med mit indlæg.
Avatar billede olebole Juniormester
09. februar 2012 - 15:16 #4
<ole>

Brug i stedet funktionen, der er skabt til den opgave. Hvad er i øvrigt årsagen til, du vil udskifte de pågældende tegn?

/mvh
</bole>
Avatar billede kennith Nybegynder
09. februar 2012 - 16:00 #5
Hej olebole det ser ud som om det er lige hvad jeg søger. Jeg skal bruge det til URL omskrivning i en webshop hvor systemet tager produktnavnet og omdanner det til en url f.eks. plæneklipper skal omskrives til plaeneklipper.htm.

Optimalt skal jeg kunne definere det der skal omskrives i en konstagt fra kontrolpanelet på shoppen, og som jeg lige kan se det skulle det sagtens kunne lade sig gøre med den funktion du linker til ved at bruge formatet 'æ'='ae', 'ø'=>'oe' osv. og lægge det i en konstant og så smide konstanten ind i array
Avatar billede Wally1973 Praktikant
09. februar 2012 - 16:20 #6
Er du sikker på at det er nok med kun de danske tegn?
Hvad med apostrofer, semikolon, kolon, punktummer osv.?

Der er typisk funktioner til at "HTMLize" en streng, så alt er gyldige HTML-tegn, hvilket også forhindrer mange injects-angreb.
Avatar billede olebole Juniormester
09. februar 2012 - 17:03 #7
@Wally1973: At sende HTML-entities i en URL er helt galt. Desuden er SQL-injections primært et problem, hvis man bruger PHP's forælde MySQL API. I dag bruger man prepared statements i MySQLI eller PDO, hvilket er langt sikrere end selv at prøve at 'hacke' sig ud af farerne.

@kennith: Hvorfor en konstant? Hvorfor ikke bare en funktion og et array?
Avatar billede olsensweb.dk Ekspert
10. februar 2012 - 19:11 #8
som olebole skriver hvorfor ikke bare en function og et array
hurtig omskrivning af  http://www.eksperten.dk/spm/944107 hvor det var modsat vej
<?php
function convert($str){
$ar = array("æ"=>"ae","ø"=>"oe","å"=>"aa","Æ"=>"ae","Ø"=>"oe","Å"=>"aa");
return strtr($str, $ar); 
}   
$urlstr="http://svømmeklubben_gå_i_vandet.dk";
echo convert($urlstr);
?>
Avatar billede kennith Nybegynder
10. februar 2012 - 21:22 #9
Jeg har ikke lige tid til at rode med det i de næste par dage da jeg har mine unger på besøg men jeg skal nok vende tilbage så snart jeg har fundet/valgt løsning.

@olebole> Jeg er som det måske fremgår af mine spørgsmål ikke så god til at kode php. Grunden til jeg vil bruge en konstant er fordi jeg gerne vil have et indtastningsfelt i kontrolpanlet hvor man kan definere havd der skal omskrives til hvad og det var det nemmeste jeg lige kunne komme på.
Avatar billede olsensweb.dk Ekspert
10. februar 2012 - 22:11 #10
>kontrolpanlet hvor man kan definere havd der skal omskrives til hvad
du kan overføre en ekstra parameter til functionen, der angiver hvilke array der skal anvendes
<?php
function convert($str, $index){
    $ar = array();
    $ar[] = array("ae"=>"æ", "oe"=>"ø","aa"=>"å","Ae"=>"Æ", "Oe"=>"Ø","Aa"=>"Å");
    $ar[] = array("æ"=>"ae", "ø"=>"oe","å"=>"aa","Æ"=>"Ae", "Ø"=>"Oe","Å"=>"Aa");
    return strtr($str, $ar[$index]); 
}   

$urlstr0="for folk der er vandskraek http://svoemmeklubben_gAa_i_vandet.nu";    
$urlstr1="http://svømmeklubben_gå_i_vandet.nu";
echo convert($urlstr0,0);
echo convert($urlstr1,1);
?>

det var det nemmeste jeg lige kunne komme på
Avatar billede olebole Juniormester
10. februar 2012 - 22:16 #11
Hvis jeg forstår det ret, kunne man gøre noget i denne stil:

convert.php:
<?php $ar=array('æ'=>'ae','ø'=>'oe','å'=>'aa','Æ'=>'ae','Ø'=>'oe','Å'=>'aa'); ?>

edit.php (kontrolpanel):
<?php
if (!empty($_POST)) {
    if (isset($_POST['conv']) && is_array($_POST['conv'])) {
        include('convert.php');
        $arrHTML = array();
        foreach ($_POST['conv'] as $val) {
            if ($val=='') continue;
            $arrHTML[] = $val;
        }
        $fp = fopen('convert.php', 'w');
        fwrite($fp, '<?php $ar=array('.implode(',', $arrHTML).'); ?>');
        fclose($fp);
    }
}
function getConverts() {
    include('convert.php');
    $arrHTML = array();
    foreach ($ar as $key => $val) {
        $arrHTML[] = '<input name="conv[]" value="\''.$key.'\'=>\''.$val.'\'" type="text">';
    }
    for ($i=0; $i<5; $i++) $arrHTML[] = '<input name="conv[]" type="text">';
    return '<div>'.implode('</div><div>', $arrHTML).'</div>';
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Untitled Document</title>
</head>
<body>

<form action="" method="post">
<input name="contxt" value="setConverts" type="hidden">
<?php echo getConverts() ?>
<p><button type="submit">Ret</button></p>
</form>

</body>
</html>

- men husk: Det skal være bag login med natopigtråd, faldlemme og lavt svævende droner!  *o)
Avatar billede kennith Nybegynder
18. februar 2012 - 02:46 #12
Den endelige kode kom til at se sådanne ud:

  class seoURL {
    var $path, $query, $params_array, $error_level, $handler_flag;

    function seoURL() {
      $this->path = $this->query = '';
      $this->params_array = array();
      $this->query_array = array();
      $this->error_level = 0;
    }

    function create_safe_string($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_\/]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      return $string;
    }

    function create_safe_name($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      if(SEO_DEFAULT_WORD_LENGTH > 1) {
        $words_array = explode($separator, $string);
        if( is_array($words_array) ) {
          for($i=0, $j=count($words_array); $i<$j; $i++) {
            if(strlen($words_array[$i]) < SEO_DEFAULT_WORD_LENGTH) {
              unset($words_array[$i]);
            }
          }
          if(count($words_array))
            $string = implode($separator, $words_array);
        }
      }
      return $string;
    }

Konstanten SEO_REWRITE_STRING bliver så defineret gennem kontrolpanelet. Ovenstående kode er primært fra en udvidelse til osCommerce der hedder SEO-G.

Jeg takker for alle inpunt men syntes det må være olebole der skal sløbe med pointne da det er ham der linker til den funktion som jeg endte med at bruge. Så olebole hvis du lige smider et svar så kviterer jeg med nogle point
Avatar billede kennith Nybegynder
18. februar 2012 - 02:47 #13
Den endelige kode kom til at se sådanne ud:

  class seoURL {
    var $path, $query, $params_array, $error_level, $handler_flag;

    function seoURL() {
      $this->path = $this->query = '';
      $this->params_array = array();
      $this->query_array = array();
      $this->error_level = 0;
    }

    function create_safe_string($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_\/]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      return $string;
    }

    function create_safe_name($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      if(SEO_DEFAULT_WORD_LENGTH > 1) {
        $words_array = explode($separator, $string);
        if( is_array($words_array) ) {
          for($i=0, $j=count($words_array); $i<$j; $i++) {
            if(strlen($words_array[$i]) < SEO_DEFAULT_WORD_LENGTH) {
              unset($words_array[$i]);
            }
          }
          if(count($words_array))
            $string = implode($separator, $words_array);
        }
      }
      return $string;
    }

Konstanten SEO_REWRITE_STRING bliver så defineret gennem kontrolpanelet. Ovenstående kode er primært fra en udvidelse til osCommerce der hedder SEO-G.

Jeg takker for alle inpunt men syntes det må være olebole der skal sløbe med pointne da det er ham der linker til den funktion som jeg endte med at bruge. Så olebole hvis du lige smider et svar så kviterer jeg med nogle point
Avatar billede kennith Nybegynder
18. februar 2012 - 02:49 #14
Den endelige kode kom til at se sådanne ud:

  class seoURL {
    var $path, $query, $params_array, $error_level, $handler_flag;

    function seoURL() {
      $this->path = $this->query = '';
      $this->params_array = array();
      $this->query_array = array();
      $this->error_level = 0;
    }

    function create_safe_string($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_\/]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      return $string;
    }

    function create_safe_name($string, $separator=SEO_DEFAULT_WORDS_SEPARATOR) {
      $revrite_string = array(SEO_REWRITE_STRING);
      $string = preg_replace('/\s\s+/', ' ', trim($string));
      $string = strtr($string, $revrite_string);
      $string = preg_replace("/[^0-9a-z\-_]+/i", $separator, strtolower($string));
      $string = trim($string, $separator);
      $string = str_replace($separator . $separator . $separator, $separator, $string);
      if(SEO_DEFAULT_WORD_LENGTH > 1) {
        $words_array = explode($separator, $string);
        if( is_array($words_array) ) {
          for($i=0, $j=count($words_array); $i<$j; $i++) {
            if(strlen($words_array[$i]) < SEO_DEFAULT_WORD_LENGTH) {
              unset($words_array[$i]);
            }
          }
          if(count($words_array))
            $string = implode($separator, $words_array);
        }
      }
      return $string;
    }

Konstanten SEO_REWRITE_STRING bliver så defineret gennem kontrolpanelet. Ovenstående kode er primært fra en udvidelse til osCommerce der hedder SEO-G.

Jeg takker for alle inpunt men syntes det må være olebole der skal sløbe med pointne da det er ham der linker til den funktion som jeg endte med at bruge. Så olebole hvis du lige smider et svar så kviterer jeg med nogle point
Avatar billede kennith Nybegynder
18. februar 2012 - 02:51 #15
Hmm ved ikke lige hvad der gik galt der jeg beklager det 3 dobbelte indlæg!
Avatar billede olebole Juniormester
18. februar 2012 - 14:50 #16
Hehe ... Eksperten er så 'avanceret' skrevet, at man er nødt til at opdatere/synkronisere databaser hver nat. Det sker omkring kl. 3 - og så går der cachenisser i kagen.

Mit eget 'trick' er, at når jeg skriver et indlæg omkring det tidspunkt, men ikke kan se det, så noterer jeg mig hvilket nummer, sidste synlige indlæg har. Derefter går jeg ud på kategorisiden og tjekker, hvormange indlæg der er skrevet. Dén side afspejler nemlig altid det reelle antal indlæg - og jeg kan se, om indlægget blev gemt eller ej  *o)

Jeg samler ikke point, så de bør gå til en eller flere af de andre deltagere. Men tak for tilbudet  =)
Avatar billede kennith Nybegynder
23. februar 2012 - 17:44 #17
Kan i andre ikke ligge nogele svar så fordeler jeg pointne
23. februar 2012 - 17:55 #18
#2 er et svar fra mig.  Det skal du naturligvis IKKE acceptere blot fordi det er der, men kun hvis du mener jeg har bidraget til løsning af spørgsmålet.  Skulle situationen blive den, at du ønsker at give mig en del af pointene, men at der ikke kommer andre svar til resten, så må løsningen være, at du selv opretter et svar og tager resten af pointene hjem igen.  (Og naturligvis, hvis du ikke har haft hjælp af mine indlæg men der kommer ingen andre svar, så opretter du et svar og accepterer kun det.)
Avatar billede olsensweb.dk Ekspert
23. februar 2012 - 18:03 #19
får du er
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