PHP 有一个
highlight_string() 函数,它可以将结构完整的 PHP 代码高亮显示。
所谓完整结构的 PHP 代码,有三种写法:
标准起始符:
<?php
echo "Hello PHP!";
?>
或者使用短输出起始标记符:
<?=
print "Hello PHP!";
?>
或者简化的短标记起始符(过去常用,现在不推荐):
<?
echo "Hello PHP!";
?>
待处理的文本如果是上述结构的内容,可能会引发PHP代码的执行,也可能因种种原因导致程序出错或结果不符合预期。如果是为了渲染 PHP 代码,那么,可以用 nowdoc 对代码略作封装,然后用文章开头提到的
highlight_string() 函数令其高亮显示:
// 封装字符串
$mystr = <<<'EOT'
<?php
function addTwoNumbers($a, $b) {
$a = intval($a);
$b = intval($b);
return $a + $b;
}
echo "201 + 26 = " . addTwoNumbers(201, 26);
?>
EOT;
echo highlight_string($mystr, true); // 渲染字符串
代码中,$mystr 是一个完整结构的 PHP 代码,里面有一个求两数之和的函数,函数被调用来求 210 和 26 两个数之和并输出计算结果。$mystr 使用了 nowdoc 结构进行封装,这样就可以原原本本地在里面书写PHP代码,不用担心字符串引号嵌套问题,也不用担心变量会被解析,界定符
<<<'EOT' 和
EOT之间所包裹的内容均被视为纯粹的字符串。
而最后一句代码调用了
highlight_string() 函数高亮显示 $mystr 封装的字符串。该函数的第二个参数是布尔值,为 true 时表示俘获高亮内容。效果如下:
<?php
function
addTwoNumbers
(
$a
,
$b
) {
$a
=
intval
(
$a
);
$b
=
intval
(
$b
);
return
$a
+
$b
;
}
echo
"201 + 26 = "
.
addTwoNumbers
(
201
,
26
);
?>
至于
nowdoc 结构,分界附
<<< 之后紧跟一个可以自定义的名称并在被封装的字符串结束后另起一行顶格以相同名称收尾,名称起始时需要引号、收尾时不要引号:
<<<'EOF'
// 这里是PHP相关的代码
EOF
PHP 中,nowdoc 类似于 HTML 中的 pre 标签,但也不是非用不可。假如我们需要动态处理混合有其它代码和完整PHP结构代码的长文本字符串,我们可以无需使用 nowdoc 结构去重新构造字符串,可以使用正则表达式去匹配完整结构的 PHP 代码,匹配到的高亮显示、其余代码保留原样。试看:
// 高亮混合字串中的PHP代码
function highlightPhpCode($text) {
return preg_replace_callback(
'/(<\?(?:php|=)?.*?\?>)/s',
function($matches) {
return highlight_string($matches[0], true);
},
$text
);
}
调用上述函数,完整结构的 PHP 代码会高亮输出,其余代码该干嘛干嘛。
——以上内容来源于对PHP文本库整站系统适应性修改、对hblog和x-diary开发过程的体会。