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

时间:2016-02-27 00:26:19

标签: php regex

我正在编写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删除了这些行?注意:语言文件不是只读的。

1 个答案:

答案 0 :(得分:1)

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

您的RegEx不起作用,因为:

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

以这种方式改变它:

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

另请注意,=不需要转义,转义方法$后跟字符。

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

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

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

eval.in demo