Springen naar inhoud

[php]preg_replace problemen


  • Log in om te kunnen reageren

#1

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 21 maart 2008 - 23:23

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

<?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
<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 -

Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 21 maart 2008 - 23:56

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:
foreach($begrip as $key => $value) {
			echo '<dfn title="'.htmlspecialchars($value).'">'.strtolower($key).'</dfn>';
}

#3

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 22 maart 2008 - 09:29

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 -

#4

Cycloon

    Cycloon


  • >1k berichten
  • 4810 berichten
  • VIP

Geplaatst op 22 maart 2008 - 11:01

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

$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:

$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

Veranderd door Cycloon, 22 maart 2008 - 11:02


#5

Ger

    Ger


  • >5k berichten
  • 16444 berichten
  • Technicus

Geplaatst op 22 maart 2008 - 12:02

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 -





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures