Pagina 1 van 1

preg_replace probleempje

Geplaatst: 20 jun 2005, 17:02
door ElbertF
Ik wil mijn pagina's op zo'n manier verwerken dat alle tekst die tussen accolades staat vertaald wordt. Dus '<div>{englisch}</div>' wordt '<div>Nederlands</div>'. Even dacht ik het heel simpel te kunnen bereiken met preg_replace, maar mijn probeersel hieronder werkt duidelijk niet.

Code: Selecteer alles

$lang['b'] = 'd';
$lang['\1'] = 'fout!';

$page = 'a {b} c';

print $page = preg_replace('/{(.+?)}/', $lang['\1'], $page);
De output is hier 'a fout! c', in plaats van 'a d c'. Iemand een idee hoe ik dit anders kan doen? :P

Geplaatst: 20 jun 2005, 19:11
door flance
$lang['\1']

alles in enkele quotes word 100% zo genomen als ingegeven, maar daar dus $lang["\1"] van. Als $lang['b'] bijvoorbeeld bestaad zal die die pakken en anders gewoon de $lang['\1'] ;)

Geplaatst: 20 jun 2005, 19:12
door ElbertF
Had ik ook al geprobeerd, geeft hetzelfde resultaat..

Geplaatst: 20 jun 2005, 19:17
door flance
Ik weet dat het niet zo netjes is, maar zo zou het kunnen:

Code: Selecteer alles


if (preg_match("/{(.+?)}/", $page,$array)) 
{
   if(isset($lang[$array[0]]))
   {
     $page=str_replace('{'.$array[0].'}',$lang[$array[0]],$page);
   }
   else
   {
     $page=$lang['\1'];
   }
} 
else 
{
   $page=$lang['\1'];
}
print($page);

Geplaatst: 20 jun 2005, 19:18
door Paul
Dan moet het toch dit zijn:

Code: Selecteer alles

if (preg_match("/{(.+?)}/", $page,$array))
{
   if(isset($lang[$array[0]]))
   {
     $page=str_replace('{'.$array[0].'}',$lang[$array[0]],$page);
   }
   else
   {
     $page=str_replace('{'.$array[0].'}',$lang['\1'],$page);
   }
}
else
{
   $page=str_replace('{'.$array[0].'}',$lang['\1'],$page);
}
print($page);
??

Geplaatst: 20 jun 2005, 19:20
door flance
Inderdaad, even niet aan gedacht. bedankt voor je oplettendheid ;)

ALleen die onderste klopt niet helemaal... daar bestaat $array namelijk niet.

Geplaatst: 20 jun 2005, 19:21
door Paul
Heb toch niks te doen :P

Geplaatst: 20 jun 2005, 19:23
door ElbertF
Maar dan ga je er nog steeds vanuit dat je $page=$lang['\1'] kan gebruiken, en dat kan dus blijkbaar niet. Met preg_match() en $array[0] kan het wel, maar dan krijg je problemen als je meerdere (verschillende) woorden wil vertalen.

Geplaatst: 20 jun 2005, 19:45
door ElbertF
Bedankt jongens, ik heb het nu zo opgelost:

Code: Selecteer alles

<?php
$lang['b'] = 'd';

$page = 'a {b} c';

foreach ( $lang as $word => $translation )
{
	$page = preg_replace('/{' . $word . '}/', $translation, $page);
}

print $page;
?>
Het parsen gaat allicht iets trager, maar het werkt.

Geplaatst: 20 jun 2005, 19:47
door flance
omg :o
De hele lang doorlopen is een optie, maar dat duurt écht heel lang.. en je hebt kans op fouten. maar het is een manier.

Geplaatst: 20 jun 2005, 19:50
door ElbertF
Het niet voor phpBB trouwens, mijn taalbestanden zullen meestal korter zijn. Ik kan ook gewoon "<div><?php print $lang['woord'] ?></div>" in de HTML opnemen, maar erg netjes is het niet.

Geplaatst: 20 jun 2005, 20:51
door ElbertF
Zo dan :P

Code: Selecteer alles

<?php
$lang['b'] = 'e';
$lang['d'] = 'f';

$page = 'a {b} c {d}';

preg_match_all('/{(.+?)}+/', $page, $match);

for ( $row = 0; $row < count($match[1]); $row ++ )
{
	$page = preg_replace('/{' . $match[1][$row] . '}/', $lang[$match[1][$row]], $page);
}

print $page;
?>
Hij loopt nu alleen de taalbestanden voor die daadwerkelijk voorkomen in de pagina :)