Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

preg_replace() code verbeteringen?

Stefan Nagtegaal
4 antwoorden
  • [code:1:c32faaeaeb]function conf_url_rewrite($path, $mode = 'incoming') {
    if ($mode == 'incoming') {
    /**
    * Outgoing Url
    * $pattern = New generated url
    * $replacement = Original url
    **/
    $pattern[] = '!^album/toevoegen$!';
    $pattern[] = '!^hoofdstuk/toevoegen$!';
    $pattern[] = '!^discussiepunt/toevoegen$!';
    $pattern[] = '!^pagina/toevoegen$!';
    $replacement[] = 'node/add/album';
    $replacement[] = 'node/add/book';
    $replacement[] = 'node/add/forum';
    $replacement[] = 'node/add/page';
    }
    else {
    /**
    * Outgoing Url
    * $pattern = Original url
    * $replacement = New generated url
    **/
    $pattern[] = '!^node/add/album$!';
    $pattern[] = '!^node/add/book$!';
    $pattern[] = '!^node/add/forum$!';
    $pattern[] = '!^node/add/page$!';
    $replacement[] = 'album/toevoegen';
    $replacement[] = 'hoofdstuk/toevoegen';
    $replacement[] = 'discussiepunt/toevoegen';
    $replacement[] = 'pagina/toevoegen';
    }

    return preg_replace($pattern, $replacement, $path);
    }[/code:1:c32faaeaeb]

    Het stuk tekst hierboven vervangt bestaande urls door deze te vertalen in het nederlands. Knap stukje werk denk ik zo.
    Maar, zoals je hierboven ziet staan, gebruik ik bijna 4 maal hetzelfde stuk code om iets te vervangen, namelijk:

    - in incoming:
    $pattern[] = '!^album/toevoegen$!';
    $pattern[] = '!^hoofdstuk/toevoegen$!';
    $pattern[] = '!^discussiepunt/toevoegen$!';
    $pattern[] = '!^pagina/toevoegen$!';
    $replacement[] = 'node/add/album';
    $replacement[] = 'node/add/book';
    $replacement[] = 'node/add/forum';
    $replacement[] = 'node/add/page';

    en
    - in outgoing (else clause):
    $pattern[] = '!^node/add/album$!';
    $pattern[] = '!^node/add/book$!';
    $pattern[] = '!^node/add/forum$!';
    $pattern[] = '!^node/add/page$!';
    $replacement[] = 'album/toevoegen';
    $replacement[] = 'hoofdstuk/toevoegen';
    $replacement[] = 'discussiepunt/toevoegen';
    $replacement[] = 'pagina/toevoegen';

    Aangezien in het 'incoming' gedeelte enkel album/hoofdstuk/discussiepunt en pagina verschillen, kunnen de 4 $patters dan niet in 1 regel opgenomen worden? Hetzelfde met $replacements en hetzelfde in het gehele 'outgoing' (else clause) gedeelte.


    Dan zou ik als het goed is dus zoiets over moeten houden:


    [code:1:c32faaeaeb]function conf_url_rewrite($path, $mode = 'incoming') {
    if ($mode == 'incoming') {
    /**
    * Outgoing Url
    * $pattern = New generated url
    * $replacement = Original url
    **/
    $pattern[] = '!^(album|hoofdstuk|discussiepunt|pagina)/toevoegen$!';
    $replacement[] = 'node/add/(album|book|forum|page)';
    }
    else {
    /**
    * Outgoing Url
    * $pattern = Original url
    * $replacement = New generated url
    **/
    $pattern[] = '!^node/add/(album|book|forum|page)$!';
    $replacement[] = '(album|hoofdstuk|discussiepunt|pagina)/toevoegen';
    }

    return preg_replace($pattern, $replacement, $path);
    }[/code:1:c32faaeaeb]

    Iemand die snapt hoe ik zoiets tot stand kan laten komen?
    Ik hoop dat het begrijpelijk is wat ik bedoel, maar het is nogal een complex geheel..
  • ik denk dat ik begrijp wat je bedoelt. Alleen begrijp ik niet het waarom. Ten minste, als je wilt optimaliseren, dan kan ik je aanraden voor simpele search&replace gewoon str_replace te gebruiken, dat is veel sneller. Je zoekt niet op bijzondere patronen en ik denk dat 4 str_replace nog altijd sneller is dan 1 complexere regexp.

    Ook van 4 regexps 1 proberen te maken is niet altijd sneller.

    Maar als je het dan toch wil, dan was je al heel aardig op weg. De pattern lijkt mij geheel correct te zijn, alleen kun je in de replacement geen regexp gebruiken.

    $replacement[] = '(album|hoofdstuk|discussiepunt|pagina)/toevoegen';

    moet worden

    $replacement[] = '$1/toevoegen';

    waar $1 verwijst naar de gevonden string tussen het eerste paar haakjes (hier dus album [i:582729a082]of[/i:582729a082] hoofdstuk [i:582729a082]of[/i:582729a082] discussiepunt [i:582729a082]of[/i:582729a082] page).

    Volgens mij moet het dan doen wat jij wil
  • Na enig benchmarken is het zelfs zo dat ik 5 str_replace() 's kan doen op exact 1 regexp.

    Dus, we gaan toch maar voor str_replace().. Ik heb nooit geweten dat str_replace() sneller was dan preg_replace(), dacht altijd dat dit andersom was.


    Trouwens, de regexp werkete hierna wel.. Stom van me, helemaal niet aan gedacht om de [i:0c8a55196f]back references[/i:0c8a55196f] te gebruiken. :-s
  • Heb je ook al eens overwogen om gebruik te maken van apache's mod_rewrite? Mits je hoster daar natuurlijk ondersteuning voor biedt.

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.