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, 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 |
#3 · Zasláno: 21. 6. 2012, 10:06:11
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 |
#4 · Zasláno: 22. 6. 2012, 00:53:03
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); sprintf('%s a ted prijde %s', $foo, $bar); |
||
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 |
#6 · Zasláno: 22. 6. 2012, 11:31:49
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:) |
||
Časová prodleva: 12 let
|
0