2012-01-31 5 views
1

コメントしていない場合にのみ、テキストをpreg_replaceしたいと思います。テキストの例を次に示します。preg_replace on some conditions

この例では、2番目、4番目、5番目の行だけを置き換えます。私は、新しいものにパラメータを置き換えたいです。すべてのテキストは改行で区切られた1つの大きな文字列です。

私はコメントセクションを削除するためにいくつかのpreg_replacesを持っていますが、私はそれらを削除したくないのであまり使いませんが、おそらくそれは誰かが私を助けてくれるのに役立ちます。

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

PHPでコメントされていない行の指定されたパラメータを置き換える手助けができますか?ありがとう!

+1

これは正規表現では不可能であると仮定します。それはHTMLとRegexで同じことです。コメントは、文字列内にある可能性があり、コメント内の文字列と一致することはできません。あなたが必要とするのはPHP Tokenizerです。 – TimWolla

+0

それは当てはまりません。あなたは理由の中で文字列を一致させることができます。 – Shane

+1

@TimWollaしかし、あなたは単純なトークナイザとして正規表現を使うことができます... – mvds

答えて

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/*を文字列リテラルに入力すると、もちろんこれは中断されます。

+0

魅力といい理論のように機能します。それはまだ考えていませんでした!ありがとう、トン! – Jeffrey

+0

'/ foo( 'bar')'では動作しません。 '// comment'の後に改行を続ける必要はありません。もちろん、 'foo( 'b // r')'のような引用されたものには問題があります。 – Qtax

+0

実際には、パラメータ内のコメントでは機能しません。しかし、それは最大の問題ではありません。 – Jeffrey

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

動作するはず

+3

1行目なら "/ * woohoo次の行もコメントしました! " "foo(bar())* /" – ArjunShankar

+0

警告:preg_replace():不明な修飾子 '\' - 上記の答えはうまくいきました。とにかく努力してくれてありがとう。 :) – Jeffrey

+0

あなたはそれにコメントがあるすべての単一の行を忘れてしまいますか? – Shane