preg_replace probleempje

Praat mee over van alles en nog wat!
Forumregels
Dit forum is voor alle zinnige gesprekken buiten phpBB om. Discussies en gesprekken over interessante onderwerpen.

Een nieuw onderwerp moet..:
  • uiteraard voldoen aan de algemene voorwaarden
  • niet passen in de gewone supportfora
  • interessante zijn voor het overgrote deel van onze gebruikers
  • een neutrale of positieve ondertoon hebben
  • anders zijn dan bestaande onderwerpen
Plaats reactie
ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

preg_replace probleempje

Bericht door ElbertF » 20 jun 2005, 17:02

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

Gebruikersavatar
flance
Berichten: 95
Lid geworden op: 01 feb 2005, 17:50

Bericht door flance » 20 jun 2005, 19:11

$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'] ;)
Voor al je webmasterhulp -> WebRookie!
Afbeelding

ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

Bericht door ElbertF » 20 jun 2005, 19:12

Had ik ook al geprobeerd, geeft hetzelfde resultaat..

Gebruikersavatar
flance
Berichten: 95
Lid geworden op: 01 feb 2005, 17:50

Bericht door flance » 20 jun 2005, 19:17

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);
Voor al je webmasterhulp -> WebRookie!
Afbeelding

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20316
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Bericht door Paul » 20 jun 2005, 19:18

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

Gebruikersavatar
flance
Berichten: 95
Lid geworden op: 01 feb 2005, 17:50

Bericht door flance » 20 jun 2005, 19:20

Inderdaad, even niet aan gedacht. bedankt voor je oplettendheid ;)

ALleen die onderste klopt niet helemaal... daar bestaat $array namelijk niet.
Laatst gewijzigd door flance op 20 jun 2005, 19:21, 1 keer totaal gewijzigd.
Voor al je webmasterhulp -> WebRookie!
Afbeelding

Gebruikersavatar
Paul
Beheerder
Beheerder
Berichten: 20316
Lid geworden op: 23 okt 2003, 11:38
Locatie: Utrecht
Contacteer:

Bericht door Paul » 20 jun 2005, 19:21

Heb toch niks te doen :P

ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

Bericht door ElbertF » 20 jun 2005, 19:23

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.

ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

Bericht door ElbertF » 20 jun 2005, 19:45

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.

Gebruikersavatar
flance
Berichten: 95
Lid geworden op: 01 feb 2005, 17:50

Bericht door flance » 20 jun 2005, 19:47

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.
Voor al je webmasterhulp -> WebRookie!
Afbeelding

ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

Bericht door ElbertF » 20 jun 2005, 19:50

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.

ElbertF
Berichten: 5803
Lid geworden op: 12 okt 2004, 08:34
Contacteer:

Bericht door ElbertF » 20 jun 2005, 20:51

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

Plaats reactie