2012-01-31 113 views
1

我想preg_replace一些文本,但只有當它沒有評論。下面是一個給定文本的例子:preg_replace在某些條件下

// delete_me('First'); 
delete_me('Second'); 
/* delete_me('Third'); */ 
delete_me('Fourth'); // Some comment behind a command. 
/* Tiny bit of comment */ delete_me('Fifth'); 

現在在這個例子中,我只想要第二,第四和第五行被替換。我想用新的參數替換參數。所有文本都在一個大字符串中,由換行符分隔。

我確實有一些preg_replaces刪除評論部分,但因爲我不想刪除它們沒有太大的用處,但也許它可以幫助有人幫助我。

$text = preg_replace("/\/\/(.*)/", $replace, $text); 
$text = preg_replace('!/\*(.*)\*/!s', $replace, $text); 

任何人都可以幫助我取代PHP中未評論的行的給定參數嗎?謝謝!

+1

我認爲這是不可能的正則表達式。它與HTML和正則表達式一樣。你不能簡單地匹配評論,因爲它們可能是一個字符串,你不能匹配字符串,因爲他們可能在評論。你需要的是PHP Tokenizer。 – TimWolla 2012-01-31 12:09:55

+0

這是不正確的。你可以在合理範圍內匹配字符串,請參閱下面的評論。 – Shane 2012-01-31 12:11:34

+1

@TimWolla,但你可以使用正則表達式作爲一個簡單的分詞器... – mvds 2012-01-31 12:17:33

回答

3

首先拆分文本註釋和非註釋的塊,那麼只有改變非註釋塊,最後把它們粘合在一起:

$in = "// delete_me('First'); 
delete_me('Second'); 
/* delete_me('Third'); */ 
delete_me('Fourth'); // Some comment behind a command. 
/* Tiny bit of comment */ delete_me('Fifth');\n"; 

$split = preg_split("#(//[^\n]*\n|/\\*.*?\\*/)#s",$in,-1,PREG_SPLIT_DELIM_CAPTURE); 

foreach ($split as $i=>$chunk) 
{ 
    if ($i%2==0) 
    { 
     $split[$i] = preg_replace("/'.*?'/","'newparam'",$chunk); 
    } 
} 

echo implode($split); 

輸出:

// delete_me('First'); 
delete_me('newparam'); 
/* delete_me('Third'); */ 
delete_me('newparam'); // Some comment behind a command. 
/* Tiny bit of comment */ delete_me('newparam'); 

這裏的訣竅是提供給preg_split的模式與com因此你會得到一些偶數/奇數的代碼/評論。

注意事項當然你會把/*放在字符串中。

+0

工程就像一個魅力,一個很好的理論。還沒有想到呢!萬分感謝! – Jeffrey 2012-01-31 12:17:32

+0

對於// foo('bar')'不起作用。一個''comment''不必緊跟一個換行符。當然,像'foo('b // r')'這樣的引用有問題。 – Qtax 2012-01-31 12:27:40

+0

確實不適用於參數內部的註釋。但這不是最大的問題。 – Jeffrey 2012-01-31 12:33:17

-1
preg_replace("[^\/\*]+", $replace, $text); 

應工作

+3

如果你有第一行:「/ * woohoo我也評論下一行!」和第2行:「foo(bar())* /」 – ArjunShankar 2012-01-31 12:16:16

+0

這不幸地提示了一個錯誤:警告:preg_replace():未知的修飾符'\' - 但上面的答案工作。無論如何感謝你的努力。 :) – Jeffrey 2012-01-31 12:19:14

+0

你想忘記每一條評論它的線? – Shane 2012-01-31 12:19:16