RegEx:匹配非转义双引号字符串

时间:2010-11-07 13:42:32

标签: php html regex escaping syntax-highlighting

我正在编写一个带有语法突出显示(用于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('   ', '&nbsp;&nbsp;&nbsp;&nbsp;', $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;
    };
?>

由于某种原因,双引号字符串会破坏其他字符串并且不会执行语法突出显示,有人知道为什么吗?先谢谢你,

2 个答案:

答案 0 :(得分:1)

不要试图用正则表达式解析像Ruby这样的不规则语言。尝试为Ruby找到一个合适的解析器,它返回一个使用过的语言标记的数组。

答案 1 :(得分:0)

Gumbo说的话。单独使用正则表达式无法正常工作。但你可以试试这个:

 preg_match("/'([^'\n\\]|\\'|\\[^'])+'/", ...

或许你可以在报价之前使用断言(?<![\\])获得更好的运气。