Php 正则表达式:匹配非转义双引号字符串

Php 正则表达式:匹配非转义双引号字符串,php,html,regex,escaping,syntax-highlighting,Php,Html,Regex,Escaping,Syntax Highlighting,我正在为我的网站编写一个用php编写的带有语法高亮显示(Ruby)的Ruby代码框,到目前为止,我可以让它为实例变量、注释、符号和全局变量着色,但我在使用以下正则表达式匹配双引号字符串时遇到了一个问题,下面是我的代码: <?php function codebox($code, $name="", $highlighted_line = -1) { echo '<table class="code_table">'; ec

我正在为我的网站编写一个用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('   ', '&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;
    };
?>

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

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

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

或者,您可能会更幸运地使用断言
(?就在引号之前。

你确定你应该只捕获双引号和单引号吗?正则表达式就是这么指示的。为什么不呢?现代模式并不是像有限自动机课程中所教的那样局限于正则语言的原始事物。我并不是说你应该在这类事情上使用模式,记住,抓住t显然,标记器的输出是一种更好的方法。但自动机课程中所教授的可计算性限制实际上与现代模式无关,现代模式有反向引用、条件、递归等等。@tchrist:在不规则语言中使用正则表达式可能适用于如今的正则表达式imp元素。但它比使用解析器复杂得多,容易出错,而且可能效率低下。有一条但书是为了举例说明为什么使用正则表达式而不是解析器可能是个坏主意,我不确定这是否天生比解析器更复杂,容易出错,或者效率低下。事实上,它是一个解析器,不是吗你不同意吗?