[英]RegEx: Match Non-Escaped Double Quoted Strings
我正在为我的网站编写一个用php编写的语法突出显示(针对Ruby的Ruby代码框),到目前为止,我可以将其着色为实例变量,注释,符号和全局变量,但是在使用以下正则表达式时遇到了问题匹配双引号字符串,这是我的代码:
<?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;
};
?>
由于某种原因,双引号引起来的字符串会打乱其他字符串,并且不会执行语法高亮显示,有人知道为什么吗? 预先感谢,ell。
不要尝试使用正则表达式解析像Ruby这样的不规则语言。 尝试为Ruby找到合适的解析器,该解析器返回使用的语言标记的数组。
口香糖说了什么。 您不能仅使用正则表达式来使其正常工作。 但是您可以尝试以下方法:
preg_match("/'([^'\n\\]|\\'|\\[^'])+'/", ...
或者,也许您在引号之前有一个断言(?<![\\\\])
会更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.