RegEx: сопоставлять строки без двойных кавычек - PullRequest
0 голосов
/ 07 ноября 2010

Я пишу кодовое поле 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 ]

1 голос
/ 07 ноября 2010

Не пытайтесь анализировать нерегулярный язык, такой как Ruby, с помощью регулярных выражений. Попробуйте вместо этого найти подходящий синтаксический анализатор для Ruby, который возвращает массив используемых языковых токенов.

0 голосов
/ 07 ноября 2010

Что сказал Гамбо. Вы не можете заставить это работать правильно только с помощью регулярных выражений. Но вы можете попробовать это:

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

Или, может быть, вам повезет с утверждением (?<![\\]) прямо перед цитатой.

...