preg replace

Programovacie jazyky, rady, poradňa...
ehm123
King
King
Príspevky: 1658
Registrovaný: 27 feb 2006, 6:45
Bydlisko: PD / Praha

preg replace

Príspevok od používateľa ehm123 »

Hello,

mam v php nieco taketo

Kód: Vybrať všetko

$html = '              
<!-- BEGIN odkazy_up -->
odkazy up
<!-- END odkazy_up -->

medzi 1

<!-- BEGIN odkazy -->
odkazy
<!-- END odkazy -->

medzi 2

<!-- BEGIN odkazy_down -->
odkazy down
<!-- END odkazy_down -->';

echo preg_replace('/<!-- BEGIN ([a-z0-9\-_.]*?) -->(.*)<!-- END ([a-z0-9\-_.]*?) -->/is', '', $html);

Ale vysledok je prazdny,teda nezobrazi text "medzi 1" a "medzi 2".Neviete kde je problém?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

Kód: Vybrať všetko

echo preg_replace('#<!-- BEGIN ([a-z0-9\-_.]*?) -->(.*?)<!-- END ([a-z0-9\-_.]*?) -->#si', '', $html); 
ehm123
King
King
Príspevky: 1658
Registrovaný: 27 feb 2006, 6:45
Bydlisko: PD / Praha

Príspevok od používateľa ehm123 »

Funguje to! Diki. Pls a vieš mi aj nejak v skratke odvôvodniť čo tie mriežky a ? spravili? Nech viem na buduce :)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Ten znak # neurobil nič (mohol tam byť akýkoľvek znak, najlepšie taký, ktorý nepoužívaš v tom regexp). Ten znak ? spôsobil, že .* nebude najdlhší možný reťazec, ale použije sa najkratší možný (hľadaj (un)greedy).
V skratke ide o to, že tá tvoja verzia použije prvé BEGIN a posledné END a všetko medzi tým sa vymaže (tá upravená verzia skončí hneď pri prvom END).
Inak v tom tvojom prípade by si asi mal používať spätné odkazy (back references), aby sa k BEGIN našlo zodpovedajúce END (hlavne, ak to bude môcť byť vnorené).
Napísať odpoveď