Vraag & Antwoord

Webprogrammeren & scripting

str_ireplace() functie optimaliseren

5 antwoorden
  • Ik heb het volgende script gemaakt, waarmee begrippen automatishc worden vervangen door een <dfn> met uitleg. Dat heb ik zo gedaan: [code:1:387dae1851]<?php $message = "Saya saya hamon kassiki tsuba"; $begrip = array( "saya", "hamon", "kassiki", "tsuba" ); $definitie = array( "<span style=\"border-bottom: 1px dotted;\"><dfn title=\"Schede\">saya</dfn></span>", "<span style=\"border-bottom: 1px dotted;\"><dfn title=\"Patroon van de overvang van gehard staal naar zachter staal op de zijde van het blad\">hamon</dfn></span>", "<span style=\"border-bottom: 1px dotted;\"><dfn title=\"Punt van de katana\">kassiki</dfn></span>", "<span style=\"border-bottom: 1px dotted;\"><dfn title=\"Scheidt het handvat van het blad en voorkomt dat het zwaard door de hand glijdt en men met het hand langs het blad glijdt\">tsuba</dfn></span>", ); $message = str_ireplace($begrip, $definitie, $message); echo $message; ?>[/code:1:387dae1851](wordt nog uitgebreid met meer begrippen natuurlijk). Nu zijn er 2 dingen die ik hier nog aan wil verbeteren:[list=1:387dae1851][*:387dae1851]Bij elke definitie in de array heb ik nu de <span> en <dfn>-tags eromheen staan. Het lijkt me dat dit gemakkelijker kan (waardoor het eenvoudiger uitbreiden wordt), maar na 2 uur proberen ben ik er nog niet uit hoe dat te doen. Kan iemand me een tip geven? [*:387dae1851]Als het begrip aan het begin van een zin staat, heeft het hoogstwaarschijnlijk een hoofdletter. Ik heb de hoofdlettergevoeligheid al omzeild door [b:387dae1851][u:387dae1851][i:387dae1851]i[/i:387dae1851][/u:387dae1851][/b:387dae1851]replace te gebruiken, maar in de vervanging heeft alles kleine letters. Liefst zou ik de exacte input gebruiken (dus variabele $begrip), maar die wordt dan weer door de replacement gehaald. Hoe kan ik dat voorkomen, of op een andere manier zorgen dat de exacte input terugkomt?[/list:o:387dae1851]
  • Ben alweer een stukje verder. Het script ziet er nu zo uit (wordt geïnclude, dus de message staat ergens anders): [code:1:f1f5bd76df]<?php $begrip['saya'] = 'Schede'; $begrip['Saya'] = 'Schede'; $begrip['kassiki'] = 'Punt van de katana'; $begrip['Kassiki'] = 'Punt van de katana'; $begrip['hamon'] = 'Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting'; $begrip['Hamon'] = 'Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting'; $begrip['tsuba'] = 'Scheidt het handvat van het blad, voorkomt tevens dat het zwaard wegglijdt en de hand langs het blad glijdt'; $begrip['Tsuba'] = 'Scheidt het handvat van het blad, voorkomt tevens dat het zwaard wegglijdt en de hand langs het blad glijdt'; foreach($begrip as $invoer => $uitleg) { $uitleg = '<dfn title="'.$uitleg.'">'.$invoer.'</dfn>'; $message = str_replace($invoer, $uitleg, $message); } ?>[/code:1:f1f5bd76df] Werkt goed, met nog één nadeel: ik heb alles 2x staan, eerst met allemaal kleine letters, dan nog met een hoofdletter aan het begin (voor als het aan het begin van een zin gebruikt wordt). Da's dubbel werk natuurlijk. Met str_ireplace() kan ik de boel case-insensitive maken, maar dan wordt nog steeds niet de uiteindelijke invoer gereturned. Dat stukje foreach() moet case-insensitive worden, maar hoe krijg ik dat voor elkaar?
  • Misschien dat je met een teller kunt werken ?, zodat hij steeds 1 invoer overslaat ? En [quote:35bbc2175b]"Patroon van de overvang[/quote:35bbc2175b] Ik denk dat dat overgang moet zijn ?
  • Spelfoutjes zijn voor nader order. :) En een teller is niet nodig. Kijk, wat ik nu heb is dat het zoekt naar een exacte match ('Hamon' of 'hamon' zijn 2 verschillende dingen voor dit script). Staat er 'Hamon' in de tekst, dan wordt de bijbehorende vervanging geregeld. Wat ik eigenlijk wil, is dat hoe dan ook wanneer de tekst "hamon" met hoofdletters, kleine letters en alle mengvormen wordt herkend én gereturned in het resultaat. Ofwel: als in de tekst staat "HaMoN", dit wordt vervangen door [code:1:ccb893569e]<dfn title="Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting'>HaMoN</dfn>[/code:1:ccb893569e] Nu weet ik wel hoe ik de herkenning case-insensitive kan maken (simpelweg [b:ccb893569e]str_replace[/b:ccb893569e] vervangen door [b:ccb893569e]str_[color=red:ccb893569e]i[/color:ccb893569e]replace[/b:ccb893569e]) maar dan wordt dat altijd gereturned als [code:1:ccb893569e]<dfn title="Golfpatroon in het staal van het snijvlak dat zichtbaar wordt na polijsting'>hamon</dfn>[/code:1:ccb893569e] Als dat aan het begin van een zin staat, of iemand wil op de een of andere manier de nadruk ergens op leggen (het is voor een forum, dus ik moet met allerlei mensen rekening houden) dan is dat niet zo netjes.
  • Ik ging even kijken in de PHP documentatie en denk dat je beter af bent met preg_replace() dan met str_replace(). Vervolgens zocht ik een mooi online voorbeeldje, maar toen [url=http://gathering.tweakers.net/forum/list_messages/1281025/]vond ik dat je al een oplossing hebt[/url]. ;) - Bas

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

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