使用PHP正则表达式

时间:2016-12-13 04:47:48

标签: php regex git

我想使用PHP Regex删除Git冲突标记。

我需要帮助使用正则表达式来搜索'<<<<<<<<<更新了上游'和' ======='。然后我会从文件中删除标记,包括它们之间的字符串。

我还需要删除'>>>>>>>隐藏的变化'字符串。

示例:

<<<<<<< Updated upstream
    'first_name','middle_name','last_name','username', 'email', 'password'
=======
    'branch_id', 'first_name','middle_name','last_name','username', 'email', 'password'
>>>>>>> Stashed changes

期望的输出:

'branch_id', 'first_name','middle_name','last_name','username', 'email', 'password'

我目前的代码:

$base_dir    = '/xampp/htdocs/sample/';

function get_files($path)
{
    $files = array_filter(glob($path.'/*'), 'is_file');
    return $files;
}

$iter = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator(
                $base_dir, RecursiveDirectoryIterator::SKIP_DOTS
            ),
            RecursiveIteratorIterator::SELF_FIRST,
            RecursiveIteratorIterator::CATCH_GET_CHILD
        );

$paths = array($base_dir);
foreach ($iter as $path => $dir) {
    if ($dir->isDir()) {
        if (strpos($path, '.git') === false) {
            $files = get_files($path);
            if (count($files) !== 0)
            {
                foreach($files as $file)
                {
                    $content = file_get_contents($file);
                    $matches = array();
                    $start = '<<<<<<< Updated upstream';
                    $end = '=======';
                    $regex = "/$start([a-zA-Z0-9_]*)$end/";
                    preg_match_all($regex, $content, $matches);
                    var_dump($regex);exit();
                }
            }
        }
   }
}

1 个答案:

答案 0 :(得分:0)

根据给出的要求,我猜你总是需要更换

<<<<<<< Updated upstream
<some lines>
=======
<some other lines>
>>>>>>> Stashed changes

<some other lines>

以下是您正在寻找的那个:

preg_replace("/<<<<<<< Updated upstream(?:.|\s)+=======((?:.|\s)+)>>>>>>> Stashed changes/", "$1", $input_lines);

其中$input_lines包含有冲突的文字。

我们在此处捕获=======>>>>>>> Stashed changes之间的文字,以替换以<<<<<<< Updated upstream开头并以>>>>>>> Stashed changes结尾的整个文字。

编辑:正如Wiktor建议的那样,这可以通过使用DOTALL修饰符来改进,如

preg_replace("/<<<<<<< Updated upstream.+?=======(.+?)>>>>>>> Stashed changes/s", "$1", $input_lines);