2011-12-25 39 views
2

我正在尋找一個正則表達式來匹配所有功能塊(從開始到結束)在PHP文件。例如:Python的正則表達式來找到文件中的PHP函數

function test_function($var) { 
if ($var == 'somethin') { 
print 'hi'; 
} 
etc. 
} 

我需要塊的起始偏移量和結束偏移量。我可以使用哪些正則表達式?

+5

正則表達式不是一個很好的選擇。用簡單的解析器會更好。 – 2011-12-25 15:02:33

回答

1

這是非常非常複雜的,不能用一個正則表達式來完成。

你可能會認爲你可以輕鬆搭配`這樣的功能的開頭:

\bfunction\b\s+\S+[^\(](\s+)?\(.*?\)\s+\{ 

但是你不能的原因是什麼,如果有這樣的代碼?

$string = "function myfunction() {}"; 

所以你應該搜索一切什麼沒有引用。所以排除帶引號的字符串您可以使用此正則表達式:

(?:(?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)(?:\\.|[^\\'"]))+ 

你應該做的是計算所有{},因爲你需要知道的功能停止時,我不能去想任何正則表達式接下來的事情這可以做到這一點。所以你需要通過循環來做到這一點。

+0

你可以用'(?R'(也可以不用Python)計算'''計數,一些子程序可以簡化引號。對於任意PHP,它還需要注意註釋等。看起來像一個很好的部分解決方案(近似值通常是更好的選擇) – mario 2011-12-25 15:22:00

+0

@micha,這是什麼*不包括引用的字符串*正則表達式應該完全是這樣嗎?它看起來不能正常使用PHP字符串,因爲它沒有把'foo'bar''當作一個有效的字符串 – Qtax 2011-12-25 15:34:10

+0

它會選擇除引用字符串以外的所有內容,請參閱[action](http://gskinner.com/RegExr/?2vcr2) – noob 2011-12-25 15:55:10

1
+0

有趣的是,它目前不支持' t支持多個引用結構 – Qtax 2011-12-25 15:38:46

+0

有人這麼做很酷,「學習更多關於解析」工業「語言,*疣和所有*」的知識。 – mario 2011-12-25 18:37:46

相關問題