2012-03-28 40 views
1

我正在研究腳本循環PHP文件和必要時重命名函數調用。這種選擇需要通過以下規則進行:PHP正則表達式負面看後面的斷言,preg_replace_callback

  • NO函數聲明//功能測試(){
  • NO靜態函數// SomeClass的:: STATICMETHOD()
  • NO類函數// $類 - >()方法
  • ONLY函數調用// myFunction的()

目前,我有以下的正則表達式:

preg_replace_callback("/((?<=function\s|\:\:|->)[a-z][a-zA-Z0-9\_]+)\(.*\)/i", 'test', $content); 
  • 函數名稱大多是用camelBack表示法編寫的。
  • 有時函數名稱包含下劃線。

這是背後斷言正面看:它使所有NO :)

所以我必須改變它的消極的方式,但是這是我的問題分爲給定的規則。當我嘗試時,它沒有按照建議工作。

編輯

當我嘗試背後斷言

'?<!' instead of '?<='

負的外觀與上面的例子中給出了下面的輸出:

  • EST()(第一遺漏)
  • taticMethod()(缺少第一)
  • ethod()(缺少第一)
  • myFunction的()(正確)

它下降我不想匹配的函數的第一個字母。有誰知道如何去做這個訣竅?

+0

什麼是不工作的建議? – stema 2012-03-28 10:34:52

+0

當我嘗試使用上面的示例對assertion('?<!'而不是'?<=')進行負面審查時,它會給出以下輸出: est(),taticMethod(),ethod(),myFunction()。 它放棄我不想匹配的函數的第一個字母。 – 2012-03-28 11:45:05

回答

0

你似乎錯了一個括號。您目前的正則表達式似乎放棄了camelcase函數的第一個字符。這似乎更好地工作(有preg_match_all測試):

preg_match_all("/(?<=function\s|\:\:|->)([a-z][a-zA-Z0-9\_]+)\(.*\)/i", $file, $matches); 

在一個側面說明,你使用的preg_replace_callback是不正確的,因爲它的第二個參數應該是一個callable

編輯

根據PO的評論,我的第一次嘗試是愚蠢的:)

你的表達的主要問題是,如果它開始於::它w生病了,這部分,但方法名稱的第一個字母將匹配您的第一個子表達式,其餘部分將作爲方法名稱匹配。

我試着用字符組另一計算策略,讓我知道它是如何工作的你:

preg_match_all('/[^:a-z]([a-z]+[a-zA-Z0-9\_]+)\(.*\)[^\s{]/i', $file, $matches); 
+0

謝謝你的改進,但這裏的工作不正確。你的正則表達式給出了我的規則:「無函數聲明//函數test()」,但我想要下面的規則:「僅函數調用// myFunction()」 在你身邊注意:我使用第二個參數作爲參考。 – 2012-03-28 12:52:04

+0

對不起。現在編輯我的答案 – Tchoupi 2012-03-28 13:19:25

+0

我實現了你的正則表達式,它似乎工作完美,謝謝! – 2012-03-28 13:28:29