如何使用正则表达式从带有 PHP 的文件中删除一行


How can I use regex to remove a line from a file with PHP?

我正在为 CodeIgniter 的语言类编写一个扩展,它将从某个文件中删除某个语言行。 该脚本提供了一个数组键,用于确定要删除的文件行。 我不相信我已经正确编写了正则表达式来检测配置文件行。 这是cat_names语言文件:

<?php
$lang['cat_123'] = 'Transportation';
$lang['cat_124'] = 'Restaurants';

这是我的语言类扩展:

public function remove_line($line, $file){
    $CI =& get_instance();
    $CI->load->helper('file');
    foreach($this->existing_langs as $lang){
        $lang_contents = read_file($this->lang_path.'/'.$lang.'/'.$file.'_lang.php');
        $new_contents = preg_replace("^$lang'['$line'] '= (.*?)''n^", '', $lang_contents);
        write_file($this->lang_path.'/'.$lang.'/'.$file.'_lang.php', 'w+');
    }
}

我使用以下方法来调用从语言文件中删除行的方法:

$this->lang->remove_line('cat_123', 'cat_names');

为什么我的preg_replace不删除线条? 注意:语言文件不是只读的。

"^$lang'['$line'] '= (.*?)''n^"
"^''$"."lang'['$line''] = (.*?)'n^"

您的正则表达式不起作用,因为:

  • 双引号字符串中的$lang被解释为变量(此外,此变量不存在);
  • 您缺少方括号内'单引号;
  • $line ,这是一个变量,被转义。

以这种方式更改它:

"^''$"."lang'['$line''] = (.*?)'n^"

另请注意,=不需要转义,转义的方式$后面跟着字符。

此外,我建议您使用单引号字符串并将分隔符设置为另一个字符(在正则表达式中^表示行首。在这里它有效,但可能会令人困惑)。

这是具有不同分隔符的单引号等效项:

'/'$lang'['''.$line.''''] = (.*?)'n/'