logi sisse meist KKK

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:

[spoiler]peidetav tekst[/spoiler]

või

[spoiler=kirjeldus]peidetav tekst[/spoiler]

Siin on asendav kood:

$pattern=$replacement=array();    
$spoilers=0;
// [spoiler]sisu[/spoiler]:
$pattern[]="/\[spoiler\](.+?)\[\/spoiler\]/is";
$replacement[]='<img src="spoiler.png" alt="spoiler" onclick="showspoiler('.
   (++$spoilers).')" /><div class="spoiler" style="display:none" id="spoiler'.
   $spoilers.'">\\1</div>';
// kuju [spoiler=desc]sisu[/spoiler]:
$pattern[]="/\[spoiler=(.+?)\](.+?)\[\/spoiler\]/is";
$replacement[]='<img src="spoiler.png" alt="\\1" onclick="showspoiler('.
       (++$spoilers).')" /><div class="spoiler" style="display:none" id="spoiler'.
       $spoilers.'">\\2</div>';
// $msg sisaldab lehe sisu
$msg=preg_replace($pattern, $replacement, $msg);

Võibolla see kood ei tööta korrektselt, kuid näitab lühidalt põhimõtet, kuidas leht genereeritakse. Asendusel tekib selline HTML-kood:

[spoiler]peidetav tekst[/spoiler]

<img src=spoiler.png" alt="spoiler" onclick="showspoiler(1)" />
<div class="spoiler" style="display:none" id="spoiler1">peidetav tekst</div>

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:

$pattern[]='/<img src=\"spoiler.png\" alt=\"spoiler\" onclick=\"showspoiler\(.+\)\" \/><div class=\"spoiler\" style=\".+\".+>(.+?)<\/div>/is';
$replacement[]="[spoiler]\\1[/spoiler]\n";
$pattern[]='/<img src=.\"spoiler.png\" alt=\"(.+?)\" onclick=\"showspoiler\(.+\)\" \/><div class=\"spoiler\" style=\".+\".+>(.+?)<\/div>/is';
$replacement[]="[spoiler=\\1]\\2[/spoiler]\n";

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:

[spoiler]esimene[/spoiler]

[spoiler]teine[/spoiler]

Tekkiv HTML:

<img src="spoiler.png" alt="spoiler" onclick="showspoiler(1)" />
<div class="spoiler" style="display:none" id="spoiler1">esimene</div>
<br />
<img src="spoiler.png" alt="spoiler" onclick="showspoiler(2)" />
<div class="spoiler" style="display:none" id="spoiler2">teine</div>

Redigeerimise jaoks asendades jääb sellest koodist järele:

[spoiler]teine[/spoiler]

Huvitav, mis seda võiks põhjustada?

küsitud Dec 07 '09 at 22:49

Teet's gravatar image

Teet
792410

edited Dec 07 '09 at 22:55


Ahtol on õigus. Probleem on selles klauslis:

onclick=\"showspoiler\(.+\)\"

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:

onclick=\"showspoiler\(.+?\)\"

Samas, arhitektuuripuhtuse mõttes on Indreku soovitus igati kasulik.

link

vastatud Dec 08 '09 at 12:33

dig's gravatar image

dig
17415

edited Dec 08 '09 at 19:29

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.

link

vastatud Dec 07 '09 at 23:43

Ahto%20Truu's gravatar image

Ahto Truu ♦♦
6596711

Hoia andmebaasis bbkoodi. Siis ei pea iga kord html-ist tagasi konverteerima.

link

vastatud Dec 07 '09 at 23:43

Indrek%20J's gravatar image

Indrek J
213

Ei ole kahjuks võimalik. Foorumi mootor dikteerib kasutatavaid reegleid.

(Dec 08 '09 at 12:50) Teet
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×22
×6

küsitud: Dec 07 '09 at 22:49

nähtud: 6,400 korda

viimati uuendatud: Dec 08 '09 at 19:29

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee