* als replacement symbool?
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?
En als je nu 2 of 3 of 40 plaatsen iets wilt neerzetten?
Als je het op die manier wilt doen, dan zou ik iets als #NAAM# gebruiken, en verderop in de tekst bijvoorbeeld #DATUM# etc etc
Of worden in dit soort situaties altijd hekjes gebruikt?
In een templating language gebruik je bijv. {{ naam }}. Maar voor strings zou ik vaak gewoon de (s)printf methode aanhouden en %s gebruiken (eventueel met plaatscijfers). Of ik zou de Symfony parameter formaat gebruiken en %naam% gebruiken. Maar bijv. in Faker gebruik je ? voor letters en # voor cijfers. Met de CmfBlockBundle gebruik je weer |%block:name%|
Ik heb nu een class, en bij een aantal methods gebruik ik een functie die een exception teruggeeft waarvan in de tekst het path moet worden vervangen door de meegegeven file of directory (zo... dat klinkt nog eens lekker onduidelijk :-) ) Maar dat kan ik niet (handig) met sprintf oplossen, dus dan gebruik ik even een string replace. Maar het gaat om simpele tekstjes zoals:
"can not remame file *"
"can not copy file *"
enz.
Die * moet dan vervangen worden, en ik vraag me af of * daar dan een "gangbaar" teken voor is. Eigenlijk is het een soort van joker-teken zeg maar.
Zoals Wouter ook al zei zou ik hiervoor gewoon sprintf() gebruiken. Ik meen me te herinneren dat jij een beetje een optimalisatiefetisjist bent ;-) en aangezien de ingebouwde functies van PHP in C zijn geschreven kun je daar qua performance nooit tegenop met je eigen PHP-code.
Quote:
Maar dat kan ik niet (handig) met sprintf oplossen
Waarom kan dat niet?
En ja, je kan * gebruiken. Maar ik prefereer toch iets waarmee je duidelijk maakt wat het is, dus %s of %file_name%.
PS: De * wordt vaak gebruikt als wildchart teken, niet als replacement teken. Denk bijv. aan SELECT * FROM ... of glob('*.php').
>> Waarom kan dat niet?
Ik moet in een heel enkel geval 2 dingen vervangen, en dan kan het dat ie de verkeerde vervangt.
Is dit dan overigens mogelijk met sprintf() ?
'dit is %s %s'
Kan ik nu in de eerste keer sprintf alleen de 2e %s vervangen en in de 2e keer alleen de eerste?
Dus zeg maar dit:
Code (php)
Kan je dat met sprintf voor elkaar krijgen? Dus bij de 1e keer sprintf moet de laatste %s worden vervangen, en bij de 2e keer moet de eerste %s worden vervangen. Kan dat? Want in dat geval kan ik het op die manier oplossen.
En * wordt niet alleen gebruikt als wildcard, maar ook als quantifier in reguliere expressies...
@Ozzie:
Waarschijnlijk heb je iets voor ogen als:
Dat verschilt eigenlijk niet van
Gewijzigd op 11/01/2014 00:37:01 door Willem vp
Code (php)
Snap je wat ik bedoel?
Waarom niet:
of ligt dat teveel voor de hand?
Toevoeging op 11/01/2014 00:41:52:
En als je moeilijk wilt doen kan natuurlijk ook nog:
Code (php)
maar ik ben er nog niet over uit of ik dit mooi vind...
Het moet dus in 2 stappen.
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. ;-)
Gewijzigd op 11/01/2014 00:50:00 door Willem vp
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.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$tmpl = "dit is %foo% %bar%";
$foo = 'bar';
$bar = 'foo';
$tmpl = str_replace('%foo%',$foo,$tmpl);
$tmpl = str_replace('%bar%',$bar,$tmpl);
?>
$tmpl = "dit is %foo% %bar%";
$foo = 'bar';
$bar = 'foo';
$tmpl = str_replace('%foo%',$foo,$tmpl);
$tmpl = str_replace('%bar%',$bar,$tmpl);
?>
Of, korter,
Gewijzigd op 11/01/2014 01:15:04 door Willem vp
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.
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.
Gewijzigd op 11/01/2014 01:21:01 door Willem vp
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 :(