views:

65

answers:

1

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);
}
+2  A: 

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

Emil H
No luck with that, but thank you
Jamie Bicknell
New solution. Try it now.
Emil H
Verified. This works.
Emil H
That's the same as my original function, which doesn't work :S
Jamie Bicknell
No it isn't. Try it and you'll see.
Emil H
My mistake! It is different and it does work!!Now just need to work on the backslashes
Jamie Bicknell
Think we've solved it!!If we put:'"<code>".highlightCode(clean_only(\'$1\'))."</code>"'Then it escapes the correct backslashes and keeps the correct ones too
Jamie Bicknell