马黑黑 发表于 2026-4-13 13:29

PHP:高亮PHP代码

<style>
    .artBox {
      font: normal 18px/1.5 sans-serif;
      overflow: auto;
      position: relative;
    }

    .artBox p {
      margin: 10px 0;
    }

    .artBox h1,
    .artBox h2 {
      margin: 8px 0;
    }

    .artBox code,
    .artBox pre {
      background: #f7f4f3;
      padding: 2px 6px;
      tab-size: 4;
    }

    .artBox pre {
      padding: 10px 20px;
      white-space: pre-wrap;
      word-wrap: break-word;
    }

    .artBox pre code {
      padding: 0;
      background: none;
    }

    .artBox blockquote {
      margin: 10px 20px;
      padding: 2px 15px;
      border-left: 3px solid skyblue;
      background: #e7e5e3;
    }
</style>

<div class="artBox">
    <p>PHP 有一个
      <code>highlight_string()</code> 函数,它可以将结构完整的 PHP 代码高亮显示。
    </p>
    <p>所谓完整结构的 PHP 代码,有三种写法:</p>
    <p>标准起始符:</p>
    <pre><code>&lt;?php
echo "Hello PHP!";
?&gt;</code></pre>
    <p>或者使用短输出起始标记符:</p>
    <pre><code>&lt;?=
print "Hello PHP!";
?&gt;</code></pre>
    <p>或者简化的短标记起始符(过去常用,现在不推荐):</p>
    <pre><code>&lt;?
echo "Hello PHP!";
?&gt;</code></pre>
    <p>待处理的文本如果是上述结构的内容,可能会引发PHP代码的执行,也可能因种种原因导致程序出错或结果不符合预期。如果是为了渲染 PHP 代码,那么,可以用 nowdoc 对代码略作封装,然后用文章开头提到的
      <code>highlight_string()</code> 函数令其高亮显示:
    </p>
    <pre><code>// 封装字符串
$mystr = &lt;&lt;&lt;'EOT'
&lt;?php
function addTwoNumbers($a, $b) {
$a = intval($a);
$b = intval($b);
return $a + $b;
}
echo "201 + 26 = " . addTwoNumbers(201, 26);
?&gt;
EOT;
echo highlight_string($mystr, true); // 渲染字符串</code></pre>
    <p>代码中,$mystr 是一个完整结构的 PHP 代码,里面有一个求两数之和的函数,函数被调用来求 210 和 26 两个数之和并输出计算结果。$mystr 使用了 nowdoc 结构进行封装,这样就可以原原本本地在里面书写PHP代码,不用担心字符串引号嵌套问题,也不用担心变量会被解析,界定符
      <code>&lt;&lt;&lt;'EOT'</code> 和
      <code>EOT</code>之间所包裹的内容均被视为纯粹的字符串。
    </p>
    <p>而最后一句代码调用了
      <code>highlight_string()</code> 函数高亮显示 $mystr 封装的字符串。该函数的第二个参数是布尔值,为 true 时表示俘获高亮内容。效果如下:
    </p>
    <p>
      <code style="background: none;">
            <span style="color: #000000">
                <span style="color: #0000BB">&lt;?php

                  <br>
                </span>
                <span style="color: #007700">function&nbsp;</span>
                <span style="color: #0000BB">addTwoNumbers</span>
                <span style="color: #007700">(</span>
                <span style="color: #0000BB">$a</span>
                <span style="color: #007700">,&nbsp;</span>
                <span style="color: #0000BB">$b</span>
                <span style="color: #007700">)&nbsp;{

                  <br>&nbsp;&nbsp;
                </span>
                <span style="color: #0000BB">$a&nbsp;</span>
                <span style="color: #007700">=&nbsp;</span>
                <span style="color: #0000BB">intval</span>
                <span style="color: #007700">(</span>
                <span style="color: #0000BB">$a</span>
                <span style="color: #007700">);

                  <br>&nbsp;&nbsp;
                </span>
                <span style="color: #0000BB">$b&nbsp;</span>
                <span style="color: #007700">=&nbsp;</span>
                <span style="color: #0000BB">intval</span>
                <span style="color: #007700">(</span>
                <span style="color: #0000BB">$b</span>
                <span style="color: #007700">);

                  <br>&nbsp;&nbsp;return&nbsp;
                </span>
                <span style="color: #0000BB">$a&nbsp;</span>
                <span style="color: #007700">+&nbsp;</span>
                <span style="color: #0000BB">$b</span>
                <span style="color: #007700">;

                  <br>}

                  <br>
                  <br>echo&nbsp;
                </span>
                <span style="color: #DD0000">"201&nbsp;+&nbsp;26&nbsp;=&nbsp;"&nbsp;</span>
                <span style="color: #007700">.&nbsp;</span>
                <span style="color: #0000BB">addTwoNumbers</span>
                <span style="color: #007700">(</span>
                <span style="color: #0000BB">201</span>
                <span style="color: #007700">,&nbsp;</span>
                <span style="color: #0000BB">26</span>
                <span style="color: #007700">);

                  <br>
                </span>
                <span style="color: #0000BB">?&gt;</span>
            </span>
      </code>
    </p>
    <p>至于
      <strong>nowdoc 结构</strong>,分界附
      <code>&lt;&lt;&lt;</code> 之后紧跟一个可以自定义的名称并在被封装的字符串结束后另起一行顶格以相同名称收尾,名称起始时需要引号、收尾时不要引号:
    </p>
    <blockquote>
      <p>&lt;&lt;&lt;'EOF'</p>
      <p>// 这里是PHP相关的代码</p>
      <p>EOF</p>
    </blockquote>
    <p>PHP 中,nowdoc 类似于 HTML 中的 pre 标签,但也不是非用不可。假如我们需要动态处理混合有其它代码和完整PHP结构代码的长文本字符串,我们可以无需使用 nowdoc 结构去重新构造字符串,可以使用正则表达式去匹配完整结构的 PHP 代码,匹配到的高亮显示、其余代码保留原样。试看:</p>
    <pre><code>// 高亮混合字串中的PHP代码
function highlightPhpCode($text) {
    return preg_replace_callback(
      '/(&lt;\?(?:php|=)?.*?\?&gt;)/s',
      function($matches) {
            return highlight_string($matches, true);
      },
      $text
    );
}</code></pre>
    <p>调用上述函数,完整结构的 PHP 代码会高亮输出,其余代码该干嘛干嘛。</p>
    <p>——以上内容来源于对PHP文本库整站系统适应性修改、对hblog和x-diary开发过程的体会。</p>
</div>

红影 发表于 2026-4-13 21:21

这个有点太专业了,不知高亮有什么用。
跟在后面学习,辛苦黑黑{:4_187:}

马黑黑 发表于 2026-4-13 22:41

红影 发表于 2026-4-13 21:21
这个有点太专业了,不知高亮有什么用。
跟在后面学习,辛苦黑黑

代码高亮时一门大学问,基于Web页渲染的有专门的高亮库、插件,专业代码编辑器集成有高亮模块。

高亮代码主要是为了美观、便于阅读,实现起来不是很容易,也会消耗一定的资源。所以,你可以看到,Discuz! 论坛提供的代码显示模块并不支持代码着色,微软的记事本打死也不上代码高亮,为的只是轻奢、便捷。

红影 发表于 2026-4-14 23:30

马黑黑 发表于 2026-4-13 22:41
代码高亮时一门大学问,基于Web页渲染的有专门的高亮库、插件,专业代码编辑器集成有高亮模块。

高亮 ...

原来高亮这么麻烦,而且消耗资源啊,这个之前完全没想到呢。

马黑黑 发表于 2026-4-15 00:11

红影 发表于 2026-4-14 23:30
原来高亮这么麻烦,而且消耗资源啊,这个之前完全没想到呢。

文本控件一般都不能高亮代码,它只能设置一种前景色和一种背景色。

没有天然的富文本控件,需要用 div 来模拟。要让 div 可以编辑并可以控制每一个字符的颜色,你想象一下怎么做

红影 发表于 2026-4-15 22:20

马黑黑 发表于 2026-4-15 00:11
文本控件一般都不能高亮代码,它只能设置一种前景色和一种背景色。

没有天然的富文本控件,需要用 div ...

我想象不出来啊{:4_173:}

马黑黑 发表于 2026-4-15 22:24

红影 发表于 2026-4-15 22:20
我想象不出来啊

你用微软记事本就可以体会到:它就是使用纯文本控件做得。当然,最新的微软记事本已经使用富文本控件了。

红影 发表于 2026-4-16 23:48

马黑黑 发表于 2026-4-15 22:24
你用微软记事本就可以体会到:它就是使用纯文本控件做得。当然,最新的微软记事本已经使用富文本控件了。

嗯嗯,这个纯文本的知道的。

马黑黑 发表于 2026-4-17 13:12

红影 发表于 2026-4-16 23:48
嗯嗯,这个纯文本的知道的。

道理是相通的

红影 发表于 2026-4-18 23:02

马黑黑 发表于 2026-4-17 13:12
道理是相通的

这样说就更好理解了{:4_187:}

马黑黑 发表于 2026-4-18 23:18

红影 发表于 2026-4-18 23:02
这样说就更好理解了

那就好
页: [1]
查看完整版本: PHP:高亮PHP代码