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?
Ozzie PHP op 11/01/2014 01:25:41

>> Eventueel zou je dus nog wel die ene %s kunnen vervangen door %s
Wat bedoel je?

Zie het tweede codefragment hier. Maar de oplossing van Koen (zie vorige bericht) vind ik eigenlijk sjieker.

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

Tsja, dat is een PHP-dingetje. Daar werkt (s)printf net weer iets anders dan in de rest van de wereld. :)


Toevoeging op 11/01/2014 09:17:15:

Wouter J op 11/01/2014 07:48:04

>> en dat dan alleen die laatste %s wordt vervangen?

Enof dat werkt. Lees eens de uitleg bij [php]sprintf[/php]...

Doel je hier op %2$s ? Dat werkt precies de andere kant uit. Je moet dan al twee parameters aanbieden. Als je 2 type specifiers hebt en slechts 1 parameter aanbiedt, werkt dat niet.
Koen Vlaswinkel op 11/01/2014 07:54:52

Dit werkt:

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

Zo hé, die werkt perfect! Nice :-) Kun je ook uitleggen waarom dit werkt? Ik snap dat bij de 1e sprintf de laatste %s wordt vervangen, maar van %%s maakt ie %s. Waarom doet ie dat?

Wouter J op 11/01/2014 07:48:04

>> en dat dan alleen die laatste %s wordt vervangen?

Enof dat werkt. Lees eens de uitleg bij [php]sprintf[/php]...

Wouter, ik heb het bekeken, maar ik zie niet waar het staat. Beter gezegd, ik weet niet waar je op doelt en waar ik dit kan vinden.

Willem vp op 11/01/2014 09:12:13

Zie het tweede codefragment hier. Maar de oplossing van Koen (zie vorige bericht) vind ik eigenlijk sjieker.

Ah sorry, die had je toegevoegd zie ik. Die had ik helemaal niet gezien! Wel grappig bedacht :-) De oplossing van Koen is inderdaad mooi, alleen weet ik niet waarom die werkt.
Normaal gesproken wordt een procentteken als iets gezien wat vervangen moet worden, en %% betekent % omdat je anders geen normaal proprocentteken zou kunnen maken. Je escaped dus eigenlijk het procentteken.

Dit zegt de manual ook bij sprintf:

A type specifier that says what type the argument data should be treated as. Possible types:
% - a literal percent character. No argument is required.
dit betekent wel dat je dan van te voren moet weten in welke volgorde je de replacing wilt gaan doen he.

Met 2 is het nog te overzien, maar met 4 of 5 wordt het een enorme berg aan %-tekens in je strings.

Ik denk dat je dan ipv 1 string in meerdere methods aan te laten passen, het overzichtelijker is, om elke method eerst een value te laten setten, om aan het einde in 1x de string aan te passen


<?php 
class foo 
{
    $string = 'een string met %s of %s replacements';
    $aReplacements = array();

    function bar1()
    {
       // doe iets leuks
       $this->aReplacements[1] = 'één';
    }

    funtion bar2()
    {
      // nog meer leuke dingen
      $this->aReplacements[2] = 'twee';
    }

    function get_string()
    {
       return sprintf($this->string, $this->aReplacements[1], $this->aReplacements[2]);
    }

    function aansturing()
    {
      $this->bar1();
      $this->bar2();

      echo $this->get_string();

    }
}
?>


als je wilt, kun je dit zelfs nog wel dynamisch krijgen, door in get_string() te achterhalen hoeveel keer er %s staat en dat aantal replacements te doen.
of als je met %2$s zou werken: te weten welke array-elementen je op moet pikken.
Oké, tot zover volg ik je. Maar waarom maakt ie van %%s dan %s? Waarom verdwijnt een van die % tekens?

Toevoeging op 11/01/2014 10:48:36:

@Ivo, in zo'n geval kun je beter nummers gebruiken denk ik, of met placeholders werken. Maar dat is in deze situatie even niet handig. De oplossing van Koen werkt voor mijn probleem prima.
Omdat %% wordt vervangen door %. Er wordt in dit geval helemaal niet gekeken naar de s omdat je de % escaped. Hij hoort in hetzelfde rijtje:
- %s -> heeft string parameter nodig en zal daardoor worden vervangen
- %d -> heeft integer parameter nodig en zal daardoor worden vervangen
- %% -> heeft geen parameters nodig en zal altijd worden vervangen door %
Ah oke... ik denk dat ik je begrijp. Dus stel dat ik normaal gesproken zou willen zeggen "de korting bedraagt 10%" dan zou ik dit doen:

sprintf('de korting bedraagt %d%%', 10);

En dan heb ik dus het %-teken ge-escaped. Begrijp ik het zo goed?
Ah, mooi :-)

Dat zijn weer van die leuke dingen. Nu ik begrijp hoe het werkt denk ik, jaaa!!
Maar zelf was ik er waarschijnlijk nooit op gekomen. Nice :)

Thanks Koen!!

Maar dat is in deze situatie even niet handig. De oplossing van Koen werkt voor mijn probleem prima.


Ik probeer in zo'n geval vooruit te denken: wat als het er meer worden?
Je hebt nu het lapmiddel van %%s, maar dat werkt alleen voor het geval je de functies in de juiste volgorde aanroept, en je de %-tekens escapet. Worden het er meer, dan wordt de derde dubbelop escaped, dus %%%%s.

Dat wordt tamelijk onoverzichtelijk.
En als je dan alsnog wilt aanpassen, moet je mogelijk heel wat code aanpassen.

Ik ga in zo'n geval het liefst voor de dynamischte oplossing. Vaak genoeg meegemaakt namelijk dat iets van 1 of 2 toch doorgroeit naar 5 of 10.

Reageren