Jamie Bicknell
Jamie Bicknell

Reputation: 2326

Highlighting Code from Database

I have a problem regarding display PHP code (stored in a database) on a website.

This is the text I have in the database:

Blah Blah Blah this is regular text    
[code]
<?php
$message = \"<div class=\'code\' style=\\\"NO\\\">\";
echo $message;
?>
[/code]
Blah Blah Blah this is more regular text

Which I want to display as:

Blah Blah Blah this isregular text
<?php
$message = "<div class='code' style=\"NO\">";
echo $message
?>
Blah Blah Blah this is more regular text

Now what I have done is the following:

<?php

echo nl2br(highlight(clean_only($post['post'])));

function clean_only($input) {
    if(get_magic_quotes_gpc()) {
        $return = stripslashes($input);
    }
    else {
        $return = $input;
    }
    return $return;
}

function highlight($t0) {
    return preg_replace('/\[code\](.*?)\[\/code\]/ise',"'<code>'.highlightCode(\"$1\").'</code>'",$t0);
}

function highlightCode($code) {
    $source_code = highlight_string($code,true);
    $source_code = str_replace(
        array('style="color: #0000BB"','style="color: #007700"','style="color: #DD0000"','style="color: #FF8000"','style="color: #000000"'),
        array('class="phpdefault"','class="phpkeyword"','class="phpstring"','class="phpcomment"','class="htmldefault"'),
        $source_code);
    return "<div class='code'><table cellspacing='1' cellpadding='2'><tr><th valign='top'>".implode("<br />",range(1,substr_count($source_code,"<br />")-1))."</th><td valign='top' nowrap='nowrap'>".str_replace("<code><span class=\"htmldefault\"><br />","<code><span class=\"htmldefault\">",preg_replace("/[\n\r]/","",$source_code))."</td></tr></table></div>";
}
?>

For some reason, it removed all PHP variables, and also messes up the quotes and backslashes. Obviously there are some backslashes that need to stay there, and some that need to go.

FYI - I'm really looking to do this without the use of JavaScript, and without have to "filter" my code input before inserting it into the database.

SOLUTION Special thanks to Emil H:

function highlight($t0) {
    return preg_replace('/\[code\](.*?)\[\/code\]/ise','"<code>".highlightCode(clean_only(\'$1\'))."</code>"',$t0);
}

Upvotes: 0

Views: 126

Answers (1)

Emil H
Emil H

Reputation: 40240

The problem is probably in highlight when preg_replace executes the code in the second parameter. Since the dollar signs are unescaped PHP will perform a regular string interpolation. Try:

function highlight($t0) {
    return preg_replace('/\[code\](.*?)\[\/code\]/ise','"<code>".highlightCode(\'$1\')."</code>"',$t0);
}

The difference is in the second parameter. You have:

"'<code>'.highlightCode(\"$1\").'</code>'"

It has to be:

'"<code>".highlightCode(\'$1\')."</code>"'

Note that I've inversed the usage of '' and "".

Upvotes: 2

Related Questions