PHP 有一个很酷的函数,它可以自动突出显示名为 highlight_string(); 的 PHP 代码。 理论上,这可以用于在网站上创建自己的代码突出显示,而不是依赖 JavaScript 或某种外部服务来完成它。 在本文中,我将向您展示其工作原理的基础知识,然后用一些技巧扩展它。 由于 JavaScript 在语法上与 PHP 非常相似,因此我们可以欺骗该函数将 JavaScript 代码也突出显示。 最后,我们将介绍一些技巧来自动缩进代码。
特别感谢 Benjamin Mayo (Darren Beige),他编写了我们将在下面介绍的 format_javascript() 函数。
基本用法
highlight_string() 函数只接受一个字符串,该字符串必须以 <?php 开头,以 ?> 结尾。 默认情况下,它会回显/打印该行。
<?php highlight_string('<?php
$i = 1;
function rockOut() {
alert("wah wah wah");
}
?>'); ?>
生成的 HTML 是
<pre id="code_highlighted"><code><span style="color: #0000BB">
<span style="color: #0000BB"><script type="text/javascript">
</span><span style="color: #007700">if (</span><span style="color: #0000BB">true</span><span style="color: #007700">) {
echo </span><span style="color: #DD0000">'The value is true'</span><span style="color: #007700">;
} else {
echo </span><span style="color: #DD0000">'The value is false'</span><span style="color: #007700">;
}
</span><span style="color: #0000BB"></script></span>
</span>
看起来像这样

很疯狂吧? 如果您希望返回该字符串而不是打印它,只需将 TRUE 作为第二个参数传递。
欺骗它以突出显示 JavaScript
Benjamin Mayo (Darren Beige) 编写了一个 PHP 函数,该函数可以欺骗 PHP 突出显示 JavaScript 代码而不是仅突出显示 PHP 代码。 除此之外,它还对代码应用了正确的制表符缩进,无论文件中是否存在制表符。 例如,即使原始代码完全左对齐 像这样,输出也会被很好地缩进。

查看演示以查看其运行情况
工作原理
缩进是通过在每个大括号和分号之后添加换行符来实现的(如果它们不存在)。 这将每个语句放在自己的行上,准备代码。 但是,缩进的大部分代码是在循环本身中完成的。
$lineecho = $line;
if (substr_count($line, "\t") != $tab) {
$lineecho = str_replace("\t", "", trim($lineecho));
$lineecho = str_repeat("\t", $tab) . $lineecho;
}
$tab = $tab + substr_count($line, "{") - substr_count($line, "}");
该块通过跟踪前一行上有多少个制表符字符(“\t”)(保存在 $tab 变量中)来工作。 使用 substr_count() 函数对当前行进行制表符计数。 如果两个值不匹配,则回显的行将用 $tab 值进行填充。 这意味着现在该行的开头处的制表符字符数量与 $tab 变量中的数量匹配。 完成此过程后,新的 $tab 值将通过获取当前的 $tab 并加上找到的左大括号的数量减去右大括号的数量来计算。
输出代码位于 <pre> 标签中,以便正确显示制表符。
用法
假设您想突出显示一个位于文件中的大型 JavaScript 代码块。 很简单,只需包含 PHP 文件/函数,获取该文件的内容,然后对其运行该函数即可。
<?php
include_once('format_javascript.php');
$BigJavaScriptString = file_get_contents('path/to/javascript.js');
echo format_javascript($testBigJS);
?>
因此,这里的问题是,如果您想以这种方式突出显示代码,则需要将其放入字符串变量中。 如果您想在 CMS 中使用它,则需要能够在保存的内容区域中保存和运行 PHP。 或者,您需要编写一些奇特的正则表达式来解析内容并查找特定标签,并能够将内部内容提取到变量中以进行突出显示。 这超出了我的能力范围。
如果您有兴趣了解如何使用它来突出显示其他语言,请查看 文档中的评论线程,其中有一些尝试突出显示 XML 和 HTML 的尝试。
哇,谢谢 Chris,很好的提示
很棒的教程......
顺便问一下,你能告诉我这个页面的语法高亮代码是如何生成的......
http://tr.im/OKyn
这是一个博客页面......
再次使用没有 JavaScript......但使用带有 style 属性的 span 标签。
我想它是由某个工具生成的......
它内置于 blogspot 中。
但是,如果您想要不同的样式,请注意 format_javascript() 允许您设置突出显示的颜色。 这在 format_javascript.php 文件中有所解释。
我不这么认为......
嘿,我认为如果您不需要颜色格式,则不需要使用 format_javascript() 函数。 如果您想突出显示 JS 代码,只需使用以下代码:
highlight_string(”);
对我来说效果很好。
PS - 我在博客中使用它。
嗯,我无法下载文件,format_javascript() 函数在哪里? 我是瞎子吗?
下载链接现在应该可以用了。
format_javascript() 函数位于 format_javascript.php 文件中。 只需将其包含在您的脚本中并调用该函数,如文章中所示。
太棒了。 有用的功能。
有没有办法添加行号?
是的。
更改
foreach ($data as $line) {
为
foreach ($data as $num => $line) {
$output .= ''.$num.'';
您可以根据需要更改输出。
为什么要重新发明轮子? http://alexgorbatchev.com/wiki/SyntaxHighlighter
它不做缩进。
是的,它做。
下载按钮不起作用;-
感谢您的提醒。 已修复。
为什么不使用 http://qbnz.com/highlighter/? 我自己使用 Pygments,但那是 Python,不是 PHP。
它不做缩进,而且它也比那个更快,因为它主要依赖于本机函数。
GeShi 确实做缩进。 您可能只需对其应用“white-space: pre”即可。
你能给我举个例子吗?
我检查了文档,唯一提到的缩进是关于它如何在 DIV 中显示代码时保持缩进。
PHP 又胜了一局!
Benjamin - 继续努力,祝你在你的事业中一切顺利!
谢谢。 我真的需要一个专门的技术博客。
“一切顺利”是什么意思?
顺便说一句,我真的很喜欢你网站上的立方体滚动效果。如果有一天可以用 JS 实现的话,那将是史诗级的。
很棒的文章和教程。
谢谢!
有趣。尽管生成的标记有点丑。
看看是否可以用 CSS 类来实现会很有趣。
PHP 提供了两个用于突出显示 PHP 代码的函数:highlight_file() ... 在突出显示其他编程代码时,例如 HTML 或 JavaScript。
highlight_file() 仍然只是一个 PHP 解析器。
不错的技巧,非常有用。谢谢!
这很好,但如果可以将
style="color: #0000BB"
替换为类似class="identifier"
的内容会更好。看起来蓝色用于几个不同的东西(文字、变量等),因此这种方法可能无法提供必要的粒度。不过,对于快速而脏的方法来说,它还不错。
此外,在 php 中,你还有 highlight_file() 函数。
谢谢您分享这个内容;它真的很酷,这是我第一次找到一个很棒的解决方案。在阅读这篇文章之前,我一直在用 CSS 颜色来给 PHP 代码着色……所以再次感谢您分享。
感谢您提供这个脚本!
我以前只知道 highlight_string() 函数。如果我没有读您的文章,我可能永远不会知道它。谢谢。
感谢您分享,这篇文章是最好的。
太棒了。效果很好,谢谢!
优秀的代码!
我是一名新手程序员,我刚发现 highlight_string(),这让我很兴奋——然后我发现了这个,彻底震撼了我的世界!
当我开始重新设计我的博客时,我一定会把它放进去!
谢谢!!