2010-11-07 226 views
0

我正在寫與用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; 
    }; 
?> 

出於某種原因,雙引號的字符串打破了其他的並沒有進行語法高亮顯示,並有誰知道爲什麼?在此先感謝,埃爾。

+0

你確定你應該只捕獲雙和單引號?正則表達式就是這樣。 – stillstanding 2010-11-07 13:52:19

回答

1

不要試圖解析一個不規則的語言像Ruby使用正則表達式。嘗試爲Ruby找到適當的解析器,而不是返回使用的語言標記的數組。

+0

爲什麼不呢?現代模式不是像有限自動機課程中所教授的那樣限制於常規語言的原始事物。我並不是說你*應該*爲這樣的一切使用模式,介意你;抓取標記器的輸出顯然是更好的方法。但正如教課程自動可計算的限制幾乎沒有相關性的現代模式,這有反向引用,條件,遞歸,等等。 – tchrist 2010-11-07 14:53:15

+0

@tchrist:使用正則表達式爲不規則的語言可能與時下正則表達式實現工作。但它比使用解析器複雜得多,容易出錯,可能效率低下。 – Gumbo 2010-11-07 14:58:48

+0

附帶條件是[這個答案](http://stackoverflow.com/questions/4044946/regex-to-split-html-tags/4045840#4045840)是作爲爲什麼使用正則表達式而不是解析器的例子這是一個糟糕的主意,我不確定這比解析器本身更復雜,容易出錯或效率低下。事實上,它**是一個解析器,你不同意嗎? – tchrist 2010-11-07 15:06:02

0

什麼濃湯說。您無法單獨使用正則表達式正確工作。不過你可以試試這個:

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

或者,也許你有更好的運氣報價前右斷言(?<![\\])

相關問題