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?

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

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