Autor | Zpráva | ||
---|---|---|---|
GeneralDv Profil |
#1 · Zasláno: 30. 1. 2011, 10:45:56
V textu potřebuju nahradit jeden kód za něco, funkcí preg_replace_callback(), smí se nahrazovat jen to co neni escapovaný \, to co je musí zustat celý:
[tag]xxx[/tag] \[tag]xxx[/tag] Napsal sem regulár, se kterym si dál už nevim rady: ~[^\\\]\[tag\](.*?)\[/tag\]~sim Vyskytly se mi tam chyby: - když je na začátku stringu a nic před nim neni, NIKDY se neprovede - vždy když neni na začátku stringu, se provede, i když je escapovanej ten kód Dokážete mi někdo dál poradit? |
||
Casper Profil |
#2 · Zasláno: 30. 1. 2011, 12:13:40
GeneralDv:
použijte negative lookbehind assertion: ~(?!=\\\)\[tag\](.*?)\[/tag\]~sim |
||
GeneralDv Profil |
#3 · Zasláno: 30. 1. 2011, 20:45:37
Dík za snahu ale dělá to taky problémy - když to escapuju, vráti to jen \ ale ne celej výraz (BBkód).
|
||
Casper Profil |
#4 · Zasláno: 30. 1. 2011, 21:33:16
GeneralDv:
Ano, omlouvám se, chyba. V php je negative lookbehind assertion ?<!, tedy ~(?<!\\\)\[tag\](.*?)\[/tag\]~sim |
||
GeneralDv Profil |
#5 · Zasláno: 30. 1. 2011, 21:56:17
Hm funguje, moc díky. Příde mi že sem dobře neschopnej protože sem se na seznam těhle konstrukcí díval a nic.
|
||
Casper Profil |
#6 · Zasláno: 30. 1. 2011, 22:13:58 · Upravil/a: Casper
GeneralDv:
Assertions je vhodné si vrýt do paměti, každopádně by jich v tomto případě ani nebylo potřeba, jen jsou mnohem elegantnější. Taktéž by však mělo fungovat: "~(^|[^\\\])\[tag\](.*?)\[/tag\]~sim" ovšem zde je třeba si uvědomit, že do výsledku je započítáván i znak před BBcode tagem, takže pokud by vám šlo o odstranění tagu, musel by se onen znak doplnit pomocí zpětných referencí, nějak takto: preg_replace("~(^|[^\\\])\[tag\](.*?)\[/tag\]~sim", "$1$2", $string); namísto pohodlných assertions (které se do zpětných referencí nezapočítávají, proto $1), kde by to vypadalo nějak takto: preg_replace("~(?<!\\\)\[tag\](.*?)\[/tag\]~sim", "$1", $string); |
||
Časová prodleva: 13 let
|
0