使用 PHP 突出显示 PHP 和 JavaScript 代码

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 价值 200 美元的免费积分!

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">&lt;script type="text/javascript">&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">true</span><span style="color: #007700">)&nbsp;{
	&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">'The&nbsp;value&nbsp;is&nbsp;true'</span><span style="color: #007700">;
	}&nbsp;else&nbsp;{
	&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">'The&nbsp;value&nbsp;is&nbsp;false'</span><span style="color: #007700">;
	}

</span><span style="color: #0000BB">&lt;/script&gt;</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 的尝试。

其他资源