Autor Zpráva
Tori
Profil
Nevíte někdo o funkci (nebo algoritmu), která by fungovala jako sprintf nebo vsprintf, ale abych místo %s mohla použít vlastní znak (např \032)? Přímo funkci vsprintf použít nechci, protože sekvence %s by se mohla v řetězci vyskytnout i jinde. Nepotřebuji žádné úpravy či formátování vkládaných hodnot kromě přetypování na řetězec.

Zkoušela jsem teď pár možností:
1) obyč. vsprintf - nejrychlejší, ale možnost chyby
2) vsprintf s escapováním procent (náhrada % => %%, náhrada \032 => %s, vsprintf, zpětná náhrada %% => %) - asi o polovinu pomalejší, ale pořád dobré
3) převod na pole a jejich složení (podobně jako zoubky zipu, $a[0] . $b[0] . $a[1] . $b[1] . atd.) - stejně rychlé jako předchozí, bez rizika nechtěného nahrazení jiné sekvence
4) řetězcové funkce (cyklické opakování strpos + substr_replace) - dvojnásobně pomalejší než předchozí
5) preg_replace_callback + lambda funkce - ještě dvojnásobně pomalejší než 4)

asi bych použila ten převod na pole a zpátky, ale zajímalo by mne, jestli to jde nějak jednodušeji. Díky.
Jan Tvrdík
Profil
Tori:
Pokud jde o čitelnost kódu, tak bych použil variantu (5). Pokud potřebuješ, aby z nějakého důvodu byl ten algoritmus velmi rychlý, tak bych použil (2).

Doplněno: varianta (4) bude pravděpodobně rychlejší, pokud nepoužiješ substr_replace. Teoreticky může být rychlejší i než (2), záleží, jak to má PHP interně implementované.
Tori
Profil
Jan Tvrdík:
Díky, substr_replace fakt není moc rychlé. Nakonec taky použiju druhou možnost, protože potřebuju zachovat kompatibilitu s PHP 5.2 (a vytvářet novou funkci jako callback nechci).
AM_
Profil
Nevím, k čemu to přesně používáš, ale nešlo by tu část stringu, kde se může %s vyskytnout, prostě taky pomocí %s vytknout?
místo
sprintf($foo.' a ted prijde %s', $bar);
napsat
sprintf('%s a ted prijde %s', $foo, $bar);
nějak mě nenapadá, v jakém případě by toto nešlo udělat... jedině že by ten formátovací řetězec byl vstupem od uživatele, ale jak tam chudák uživatel bude psát \032?
Tori
Profil
AM_:
To je do routeru (před pár týdny jsem se tu ptala na názor) - pro předgenerované URL, do kterých se jen pomocí str_replace doplňuje jedna hodnota (místo aby se pokaždé skládaly z parametrů + hledala se vhodná cesta). Chtěla bych umožnit doplňování několika různých hodnot = variabilní počet parametrů té metody = už nemůžu použít str_replace. Znak SUB (0x1F / 032) jsem použila, protože se na 100% nemůže vyskytnout v URL. U %s si nejsem tolik jistá. Takže ten řetězec, kde se provádí nahrazení může vypadat třeba takhle: http://www.example.com/hledat/programatori/podle-mesta/\032?strana=\032#\032 a provedu s ním něco jako vsprintf($urlTemplate, array('Bratislava', 2, 'Ferko_Mrkvička')); Nevím předem, kolik těch zástupných znaků tam bude (0 a víc). (Jestli vás napadne lepší řešení, budu jen ráda. Je to tahle a následující metoda.)
AM_
Profil
Když o tom tak přemýšlím, nebylo by nejjednodušší v té url všechna procentítka psát jako %25 (korektně oescapované), tím si zajistíš, že se tam nikde nevyskytne %s?
Jinak je asi v tomhle případě tvoje řešení v pořádku, já jsem holt zvyklý spíš dávat přednost robustnosti a přehlednosti před rychlostí kódu, takže URL si parsuju a vytvářím pomocí vlastní pársetřádkové třídy, kde můžu pohodlně měnit a dosazovat jakýkoli parametr:)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: