Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: koodin väritys?

ipe [07.04.2005 18:15:25]

#

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 &lt;php ja silloin ei highlight_string osaa värittää koodia. Mikä avauksi?

Blaze [07.04.2005 18:29:36]

#

Aja se htmlspecialcharskin vasta tekstiä näytettäessä.

Antti Laaksonen [07.04.2005 18:54:56]

#

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ä.

ipe [07.04.2005 21:08:49]

#

ööö.. luulen että tajusin, mutta en osaa vieläkään toteutta tuota =D Eli tämmöstä vähän ajattelin:

<?php
$r="[kootia]&lt;?php echo \"moi\"; ?&gt;[/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?

Antti Laaksonen [07.04.2005 21:23:19]

#

Koetahan tähän tyyliin:

<?php

$r="[kootia]&lt;?php echo \"moi\"; ?&gt;[/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.

ipe [07.04.2005 21:27:47]

#

Kiitos kovasti :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta