【问题标题】:Highlighting Code from Database突出显示数据库中的代码
【发布时间】:2010-11-26 19:14:09
【问题描述】:

我在网站上显示 PHP 代码(存储在数据库中)时遇到问题。

这是我在数据库中的文本:

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

我想显示为:

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

现在我所做的如下:

<?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>";
}
?>

由于某种原因,它删除了所有 PHP 变量,并且还弄乱了引号和反斜杠。显然,有些反斜杠需要保留在那里,有些则需要删除。

仅供参考 - 我真的很想在不使用 JavaScript 的情况下执行此操作,并且在将代码输入插入数据库之前不必“过滤”我的代码输入。

解决方案 特别感谢 Emil H:

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

【问题讨论】:

  • 你是一个了不起的家伙!如果我能不止一次地感谢你,我会的!

标签: php regex highlighting


【解决方案1】:

当 preg_replace 执行第二个参数中的代码时,问题可能突出显示。由于美元符号未转义,PHP 将执行常规字符串插值。试试:

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

区别在于第二个参数。你有:

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

必须是:

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

请注意,我颠倒了 '' 和 "" 的用法。

【讨论】:

  • 这和我原来的功能一样,不起作用:S
  • 不,不是。试试看,你会看到的。
  • 我的错!这是不同的,它确实有效!现在只需要处理反斜杠
  • 认为我们已经解决了!如果我们输入: '"".highlightCode(clean_only(\'$1\')).""' 那么它会转义正确的反斜杠并保留正确的反斜杠
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2010-11-21
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多