preg_replace在某些条件下

时间:2012-01-31 12:06:23

标签: php regex 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评论的行上的给定参数吗?谢谢!

2 个答案:

答案 0 :(得分: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的模式与注释块匹配,因此你得到一组偶数/奇数代码/注释。

警告当您将/*放入字符串文字中时,这当然会中断。

答案 1 :(得分:-1)

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

应该工作