Avatar billede tamen Nybegynder
14. juni 2007 - 20:34 Der er 6 kommentarer og
1 løsning

Finde %et|to|tre|% og erstate med enten et, to eller tre.

Finde %et|to|tre|% og erstatte "%et|to|tre|%"  med enten et, to eller tre.

Er ovenstående muligt med regexp? Eller skal jeg virkelig til at bygge noget template halløj.
Jeg kan godt finde "%et|to|tre|%"  med regexp, men ved ikke om jeg kan erstatte det med en del af sig selv.
Avatar billede roenving Novice
15. juni 2007 - 14:07 #1
Hvordan ved du hvad, der skal erstattes ?-)
Avatar billede tamen Nybegynder
15. juni 2007 - 15:30 #2
Det er en del af den del af strengen som den skal finde.

%et|to|tre% skal erstattes med enten et, to eller tre.
%rød|gul|grøn% skal erstattes med enten rød, gul, eller grøn.

Jeg har lavet en hurtig PHP-funktion der gør det:

<?php
    $text = 'Bunnies are %small|furry|delicious in a stew|dangerous%, and taste like %shit|chicken|gumdrops%.';

    echo uniqify($text);
   
    function uniqify($text)
    {
        preg_match_all('/\%.+?\%/', $text, $matches);
        foreach ($matches[0] as $m) {
            $m = str_replace('%', '', $m);
            $ms = explode('|', $m);
            $text = str_replace('%'.$m.'%', $ms[rand(0, count($ms)-1)], $text);
        }
        return $text;
    }
?>

Men kan det gøres udelukkende med regexp?
Avatar billede jensgram Nybegynder
24. juni 2007 - 10:36 #3
Et bud med call-back:


$text = 'Bunnies are %small|furry|delicious in a stew|dangerous%, and taste like %shit|chicken|gumdrops%.';

preg_replace('/\%([^%]+)\%/e', "pick(explode('|', '\\1'))", $text);

function pick($items) {
    return $items[rand(0, count($items) - 1)];
}

Utestet.
Avatar billede jensgram Nybegynder
24. juni 2007 - 10:38 #4
Testet og virker:

<?php

$text = 'Bunnies are %small|furry|delicious in a stew|dangerous%, and taste like %shit|chicken|gumdrops%.';

print preg_replace('/\%([^%]+)\%/e', "pick(explode('|', '\\1'))", $text);

function pick($items) {
    return $items[rand(0, count($items) - 1)];
}

?>


Men det er jo stadig ikke én RE :(
Avatar billede jensgram Nybegynder
24. juni 2007 - 10:40 #5
Alternativt (blot lidt mere læsevenligt):

function pick($items) {
    return $items[array_rand($items)];
}
Avatar billede tamen Nybegynder
24. juni 2007 - 13:21 #6
Se den er jo en del simplere. Smid et svar hvis du vil have points. Jeg tror det er det tætteste vi kommer på det :)
Avatar billede jensgram Nybegynder
24. juni 2007 - 13:46 #7
Ja, mine evner rækker ihvertfald ikke til yderligere optimering :)
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
Kurser inden for grundlæggende programmering

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