使用 php 替换某些地方的文本片段

Replacing text fragments in places using php

我需要使用 php 替换文本文件中的字符串。我有示例内容:

[prev title="sample1" cont="sample1a" res="sample1b" mw="1"][prev title="sample2" cont="sample2a" res="sample2b" mw="2"][prev title="sample3" cont="sample3a" res="sample3b" mw="3"]...

我需要移动每个片段 'cont="sample" res="sample"' 并在 [prev title =] 之间插入以获得结果:

[prev cont="sample1a" res="sample1b" title="sample1" mw="1"]...etc

我尝试preg_replace一些东西,但不是很多

$getCont = file_get_contents($file);
$delText = trim(preg_replace('/prev.*?cont/', '/prev res.*? mw/', $getCont));
file_put_contents($file, $delText);

我已经知道这不是办法。你能帮忙吗?

这是一个选项,使用 preg_replace:

$input = "[prev title=\"sample1\" cont=\"sample1a\" res=\"sample1b\" mw=\"1\"][prev title=\"sample2\" cont=\"sample2a\" res=\"sample2b\" mw=\"2\"][prev title=\"sample3\" cont=\"sample3a\" res=\"sample3b\" mw=\"3\"]";
echo $input;
$output = preg_replace('/(title=\"[^"]+\") (cont=\"[^"]+\") (res=\"[^"]+\")/', "  ", $input);
echo "\n" . $output;

[prev cont="sample1a" res="sample1b" title="sample1" mw="1"]
[prev cont="sample2a" res="sample2b" title="sample2" mw="2"]
[prev cont="sample3a" res="sample3b" title="sample3" mw="3"]

我们匹配捕获括号内词条的前三项,然后按照你想要的顺序形成替换。

您可以使用正后视和 2 个捕获组并替换为组 2 和组 1:

(?<=\[prev)( title="[^"]+")( cont="[^"]+" res="[^"]+")

那将匹配

  • (?<=\[prev) 肯定的外观断言左边的是 [prev
  • ( title="[^"]+") 匹配 title= 包括双引号和第 1 组中的内容
  • ( cont="[^"]+" res="[^"]+") match cont= and res= including the double quotes and the content in group 2

替换为切换组 1 和组 2。

Regex demo | Php demo

您可以通过多种方式实现,例如使用 regex在分解后重新排序字符串 等等。我的一种非正则表达式方式。

<?php
$str = '[prev title="sample1" cont="sample1a" res="sample1b" mw="1"][prev title="sample2" cont="sample2a" res="sample2b" mw="2"][prev title="sample3" cont="sample3a" res="sample3b" mw="3"]';
$arr = explode('][',$str);
$expected = '';
foreach($arr as $row){
    $res = explode(' ',trim($row,'[]'));
    $expected.= '['.$res[0].' '. $res[2].' '.$res[3].' '.$res[1].' '.$res[4].']';
}
echo $expected;
?>

输出:

[prev cont="sample1a" res="sample1b" title="sample1" mw="1"]
[prev cont="sample2a" res="sample2b" title="sample2" mw="2"]
[prev cont="sample3a" res="sample3b" title="sample3" mw="3"]

演示: https://3v4l.org/FE8Xq