我正在编写一个带有语法突出显示(用于Ruby)的Ruby代码框,用PHP编写我的网站,到目前为止,我可以使用颜色实例变量,注释,符号和全局变量,但是在使用时遇到了问题以下正则表达式匹配双引号字符串,这是我的代码:
<?php
function codebox($code, $name="", $highlighted_line = -1)
{
echo '<table class="code_table">';
echo '<tr>';
echo '<td class="code_table_header"></td>';
echo '<td class="code_table_name">$name</td>';
echo '<td class="code_table_header"><a href="" class="copy_to_clipboard_link">copy to clipboard</a></td>';
echo '</tr>';
$oddity = 'even';
$line_number = 1;
foreach(preg_split('/(\r?\n)/', $code) as $line)
{
echo '<tr>';
if($line_number % 10 == 0)
{
echo '<td class="line_number" style="font-weight:bold;">' . $line_number . '</td>';
} else {
echo '<td class="line_number">' . $line_number . '</td>';
}
if($line_number == $highlighted_line)
{
echo '<td class="selected_code_cell" colspan="2">' . syntax_highlight($line) . '</td>';
} else {
echo '<td class="' . $oddity . '_code_cell" colspan="2">' . syntax_highlight($line) . '</td>';
}
echo '</tr>';
$line_number += 1;
if($oddity == 'even')
{
$oddity = 'odd';
} else {
$oddity = 'even';
};
};
};
function syntax_highlight($code)
{
// Make it so html doesn't bodge up
$code = htmlentities($code);
// Replace tabs with 4 none blocking spaces
$code = str_replace(' ', ' ', $code);
//instance variables
$code = preg_replace('/\B(\@\w*\S)/', '<span style="color:lime;">$1</span>', $code);
//global variables
$code = preg_replace('/\B(\$\w*\S)/', '<span style="font-weight:bolder;color:#00b0f0;">$1</span>', $code);
//symbols
$code = preg_replace('/\B(\:\w*\S)/', '<span style="color:yellow;">$1</span>', $code);
//strings (double quote)
$code = preg_replace('/"(?:\.|(\\\")|[^\""\n])*"/', '<span style="font-style:italic;color:#FF5A00;">$1</span>', $code);
//strings (single quote)
//$code = preg_replace('/\'(?:\.|(\\\')|[^\'\'\n])*\'/', '<span style="font-style:italic;color:#FF5A00;">$1</span>', $code);
return $code;
};
?>
由于某种原因,双引号字符串会破坏其他字符串并且不会执行语法突出显示,有人知道为什么吗?先谢谢你,
答案 0 :(得分:1)
不要试图用正则表达式解析像Ruby这样的不规则语言。尝试为Ruby找到一个合适的解析器,它返回一个使用过的语言标记的数组。
答案 1 :(得分:0)
Gumbo说的话。单独使用正则表达式无法正常工作。但你可以试试这个:
preg_match("/'([^'\n\\]|\\'|\\[^'])+'/", ...
或许你可以在报价之前使用断言(?<![\\])
获得更好的运气。