Gebruikersavatar
Ger
Artikelen: 0
Berichten: 17.676
Lid geworden op: di 18 okt 2005, 09:51

[php]preg_replace problemen

Ik heb de volgende functie die ik include in een phpBB forum:

Code: Selecteer alles

<?php

$begrip = array( 

'Aikuchi' => 'Kleine tanto zonder tsuba.',

'Ashi' => 'Smalle kanaaltjes van zachter staal uitlopend van de ji tot de hamon.',

//array loopt nog tig regels door met allerlei begrippen, tbv overzicht hier even weggehaald

); 

$message = preg_replace( 

'/(?<=[>\s(?]|^)(' 

. implode( 

'|', 

array_map( 

create_function( 

'$s', 

'return preg_quote($s, "/");' 

), 

array_keys( 

$begrip 

) 

) 

) 

. ')(?=[\s.,<)?]|$)/ie', 

'\'<dfn title="\' . htmlspecialchars(\$begrip[strtolower(\'$0\')]) . \'">$0</dfn>\'', 

$message 

);

?>
Doet netjes zijn werk, op 1 ding na: het title-attribuut van dfn is leeg. Ofwel: de output is

Code: Selecteer alles

<dfn title="">aikuchi</dfn>
Je zou zeggen dat ik dan iets vergeet te escapen of wat aanhalingstekens vergeet, maar hoe vaak ik er ook naar kijk, ik zie het niet meer. Sterker nog: inmiddels zie ik alleen maar dansende tekens ...

Wat doe ik fout?
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: [php]preg_replace problemen

Ik vraag me af wat jij eigelijk precies wil bereiken als output tussen de title tags? Het lijkt mij alleszins dat je het veel te moeilijk zoekt.

Het kan best zijn dat ik niet begrijp wat je wil bereiken, maar dit zou normaal de output moeten opleveren die jij vraagt:

Code: Selecteer alles

foreach($begrip as $key => $value) {

echo '<dfn title="'.htmlspecialchars($value).'">'.strtolower($key).'</dfn>';

}
Gebruikersavatar
Ger
Artikelen: 0
Berichten: 17.676
Lid geworden op: di 18 okt 2005, 09:51

Re: [php]preg_replace problemen

Ik zal sowieso met een preg_replace aan de gang moeten. Wat het script eigenlijk doet, is een bericht dat iemand op het forum wil posten doorzoeken op woorden die in de array staan en ze vervangen door hetzelfde woord, maar dan met <dfn>-tags met een title-atrribuut eromheen.

Ik had het eerder inderdaad met een foreach() gedaan, maar dan kom je in de problemen met woorden waarvan een deel daarvan ook weer een woord is. Bijvoorbeeld "ha" en "hamon". Dat wordt dan dubbel vervangen met as resultaat dat een een half stuk HTML overhoud in het bericht. De loop limiten op 1 gaat niet, aangezien je niet weet hoeveel begrippen iemand in een bericht zet.
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -
Gebruikersavatar
Cycloon
Artikelen: 0
Berichten: 4.810
Lid geworden op: ma 24 jan 2005, 20:56

Re: [php]preg_replace problemen

Toch maar even naar je code gekeken dan, ik vermoed dat hier de fout zit:

Code: Selecteer alles

$begrip[strtolower(\'$0\')]
Wanneer je dus strtolower hier gebruikt dan zit je array fout in mekaar. $begrip['ashi'] oproepen is niet hetzelfde als $begrip['Ashi']

Volgens mij heb je dus nodig:

Code: Selecteer alles

$begrip[ucfirst(strtolower(\'$0\'))]
Ik denk dat deze het wel zal doen.

Edit: Ik ben trouwens ook niet zeker of die single quotes daar moeten staan, mocht het nog niet werken dan zou ik ook proberen om even die single quotes weg te gooien :D
Gebruikersavatar
Ger
Artikelen: 0
Berichten: 17.676
Lid geworden op: di 18 okt 2005, 09:51

Re: [php]preg_replace problemen

Jij krijgt de volgende bijeenkomst een pilsje van me! :D

Hier was ik me dus al sinds gisteren een uur of acht op aan het blindstaren. Mijn dank is dus groot. :P
"Knowledge speaks, but wisdom listens."
- Jimi Hendrix -

Terug naar “Informatica en programmeren”