我想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评论的行上的给定参数吗?谢谢!
答案 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);
应该工作