Mul on vähän ongelmaa php koodin värityksen kanssa. Eli mul on semmonen kommentoinit systeemi tuloillaan ja siinä on lisinä kaikenmoisia bbc koodeja. Yks niistä on php koodi. Aattelin et ei oo järkee kirjottaa tietokantaan highlight_string funkkarin tuotosta ja siks käytän sitä vasta viestien tulostusvaiheessa tähän tyyliin:
$s=preg_replace("/(\[php\])(.+?)(\[\/php\])/", "<pre><div class=\"koodiphp\">".highlight_string('$2', true)."</div></pre>", $s);
Tässä on nyt kuitenkin semmonen ongelma, että kun estän html tagit niin php:n alotus tallentuu tietokantaan näin <php ja silloin ei highlight_string osaa värittää koodia. Mikä avauksi?
Aja se htmlspecialcharskin vasta tekstiä näytettäessä.
Mutta jos htmlspecialchars tulee vasta muunnoksen jälkeen, se estää myös ne tagit, joiden ansiosta PHP-koodin kuuluisi näkyä väritettynä.
Yksi ratkaisu on korvata highlight_string toisella funktiolla, jonka sisällä on hieman muutakin kuin pelkkä tekstin väritys. Funktio html_entity_decode muuttaa erikoismerkit takaisin entiselleen. Kun tämä muutos on tehty, merkkijonon voi värittää highlight_stringillä. Tätä tapaa olen käyttänyt myös tämän keskustelualueen värityksessä.
ööö.. luulen että tajusin, mutta en osaa vieläkään toteutta tuota =D Eli tämmöstä vähän ajattelin:
<?php $r="[kootia]<?php echo \"moi\"; ?>[/kootia]"; $s=preg_replace("/(\[kootia\])(.+?)(\[\/kootia\])/", "<pre><div class=\"koodiphp\">".html_entity_decode(highlight_string('$2', true))."</div></pre>", $r); echo "$s"; ?>
Mut ei toimi :( Mikäs nyt neuvoks?
Koetahan tähän tyyliin:
<?php $r="[kootia]<?php echo \"moi\"; ?>[/kootia]"; function phpkoodi($teksti) { return "<pre><div class=\"koodiphp\">". highlight_string(stripslashes(html_entity_decode($teksti)), true). "</div></pre>"; } $s=preg_replace("/(\[kootia\])(.+?)(\[\/kootia\])/e", "phpkoodi('\\2')", $r); echo "$s"; ?>
Nyt entiteetit poistetaan html_entity_decoden avulla ja kenoviivat stripslashes-funktiolla. Huomaa myös funktion yhdistäminen säännölliseen lausekkeeseen: lausekkeen lopussa on e-merkintä ja funktion nimi pitää kirjoittaa merkkijonon sisään.
Kiitos kovasti :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.