Ola,

Ik vraag me af of een * wel eens gebruikt wordt als een replacement symbool in een tekst. Dus bijv.
"Hallo *, welkom op onze site.". Of zijn er andere/beter symbolen die je hiervoor kunt gebruiken?
Ja klopt, maar de ene sprintf() gebeurt in method A en die 2e in method B. In method A bereid ik de string voor voor method B. Dus in method A is de begin-string 'dit is %s %s' en moet de string worden 'dit is %s test'. Deze geef ik dan aan method B en dan moet het 'dit is een test' worden.

Het moet dus in 2 stappen.
of

<?php

echo sprintf('een, %2$s, %1$s-%1$s', 'drie', 'twee');
   #  een twee drie-drie
?>


om aan te geven dat een waarde vaker voor kan komen, en dat de volgorde er niet per se toe doet
Ozzie PHP op 11/01/2014 00:42:50

Ja klopt, maar de ene sprintf() gebeurt in method A en die 2e in method B. In method A bereid ik de string voor voor method B. Dus in method A is de begin-string 'dit is %s %s' en moet de string worden 'dit is %s test'. Deze geef ik dan aan method B en dan moet het 'dit is een test' worden.

Maar als ik nu terug ga naar je eerste post, waar je * wilt gebruiken als replacement character, heb je dan niet hetzelfde probleem wanneer je string "dit is * *" is? Overigens geef je een post verder aan dat je slechts één ding hoeft te vervangen. ;-)
Thanks Ivo, maar nu ben ik wel erg benieuwd of mijn "probleem" is op te lossen.

We hebben dus de begin-string:

$string = 'dit is %s %s';

In ronde 1 moet in deze string alleen de laatste %s worden vervangen. Dan krijgen we:

$string = 'dit is %s test';

In de volgende ronde moet de overgebleven %s worden vervangen. Dan krijgen we:

$string = 'dit is een test';

Snappen jullie wat ik wil?



Toevoeging op 11/01/2014 00:52:23:

@Willem:

Zoals ik hierboven zei moet ik in een enkel geval 2 dingen vervangen ;) Anders had ik het gewoon met sprintf kunnen oplossen.

Maar snappen jullie de bedoeling. Kan me voorstellen dat het een beetje overkomt wat ik bedoel.

In dat geval zou ik het gewoon doen op een van de door Wouter beschreven manieren, dus met iets als %macro%:
<?php
$tmpl = "dit is %foo% %bar%";
$foo = 'bar';
$bar = 'foo';
$tmpl = str_replace('%foo%',$foo,$tmpl);
$tmpl = str_replace('%bar%',$bar,$tmpl);
?>
Of, korter,
<?php
$tmpl = str_replace(['%foo%','%bar%'], [$foo,$bar], $tmpl);
?>
Hmm, oké...

Maar als ik je goed begrijp is dit onmogelijk:

sprintf('dit is %s %s', 'test');

en dat dan alleen die laatste %s wordt vervangen?

Bijv. zoiets als dit:

sprintf('dit is %s %1$s', 'test');

Dat test alleen wordt gebruikt voor nummer 1, en dat ie die andere ongemoeid laat... maar dit werkt dus niet.
In dat geval ga je een null value voeren aan een placeholder en dat is nooit aan te bevelen...
Eventueel zou je dus nog wel die ene %s kunnen vervangen door %s, zoals ik in een eerdere post al schreef. Je code wordt daar denk ik niet echt veel duidelijker door, maar het werkt wel.
>> Eventueel zou je dus nog wel die ene %s kunnen vervangen door %s

Wat bedoel je?

>> In dat geval ga je een null value voeren aan een placeholder en dat is nooit aan te bevelen...

Nou het werkt sowieso niet, want beide %s worden dan vervangen :(
>> en dat dan alleen die laatste %s wordt vervangen?

Enof dat werkt. Lees eens de uitleg bij [php]sprintf[/php]...
Dit werkt:
[code]
<?php
$string = 'dit is %%s %s'; // dit is de begin-string
$string = sprintf($string, 'test'); // string moet nu worden 'dit is %s test';
$string = sprintf($string, 'een'); // string moet nu worden 'dit is een test';
?>

Reageren