Ga naar inhoud

preg_replace() code verbeteringen?


anoniem

Aanbevolen berichten

[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..
Link naar reactie
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
Link naar reactie
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
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...