|
Taas üks probleem regulaaravaldistega. Püüan progeda foorumi jaoks nn. spoiler-elementi, mis peaks peale klikkides avama tekstisisu, mis on vaikimisi peidetud. Elemendi vorming on järgmine:
või
Siin on asendav kood:
Võibolla see kood ei tööta korrektselt, kuid näitab lühidalt põhimõtet, kuidas leht genereeritakse. Asendusel tekib selline HTML-kood:
Siiani on kõik hästi, koodi genereerimine töötab õigesti. Oletame aga, et soovin oma postituse koodi muuta. Selleks tuleb mul teha HTML-koodist tagasiasendus. miniBB töötab viisil, et asendab redigeerima asumisel html-koodi regulaaravaldiste abil tagasi bb-koodiks, nii on kirjutatud kogu redigeerimismootor. Püüdsin konstrueerida tagasiasenduse:
Kui postituses on üks spoiler-element, siis on kõik korras, kuid kui postituses on kaks spoiler-elementi, jääb regulaaravaldistes alles ainult üks: Originaal:
Tekkiv HTML:
Redigeerimise jaoks asendades jääb sellest koodist järele:
Huvitav, mis seda võiks põhjustada? |
|
Ahtol on õigus. Probleem on selles klauslis:
Kuna .+ võib kõike matchida, võib ta kenasti ära matchida esimese spoilerkoodi lõpu, kahe spoilerkoodi vahele jääva teksti ja järgmise spoilerkoodi alguse. Heldeks saab ta plussi järele küsimärgi lisamisel, niimoodi:
Samas, arhitektuuripuhtuse mõttes on Indreku soovitus igati kasulik. Nagu eelmisele postile viitasin, ei ole võimalik. Küllap on miniBB progejad teinud sellise otsuse põhjusel, et nende loodud postitus jääks ajaloos visuaalselt samaks ka pärast foorumi BB-koodimootori muutmisi.
(Dec 08 '09 at 13:00)
Teet
Tõenäolisem põhjus on kiirus: valmis HTML-iks konverteeritud postitusi on kiirem kuvada. Aga ma ei usu, et see on piisavalt hea põhjus, sest on teisigi võimalusi kuidas kiirust suurendada.
(Dec 08 '09 at 20:34)
Rene Saarsoo ♦♦
Proovisin, küsimärgi lisamine avaldisse teeb asja ära. Jälle veidi targem regulaaravaldiste suhtes ja vahva, et asjal oli nii lihtne lahendus.
(Dec 08 '09 at 20:39)
Teet
|
|
Ma arvan, et põhjus on selles, et vaikimisi on regulaaravaldised ahned (ingl greedy), see tähendab, et iga avaldis püüab enda vasteks haarata nii pika osa tekstist kui võimalik. Otsi oma PHP dokumentatsioonist, kuidas neid mitteahneks muuta. |
