我想使用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();
}
}
}
}
}
答案 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);