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



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

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

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

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

我试着预先放置一些东西,但没有太多

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

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

您可以使用一个正向后备和两个捕获组,并替换为组2和组1:

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

这将匹配

  • (?<=[prev)肯定地看,断言左边的是[prev
  • ( title="[^"]+")匹配标题=包括双引号和组1中的内容
  • ( cont="[^"]+" res="[^"]+")匹配cont=和res=,包括双引号和组2中的内容

替换为切换组1和组2。

Regex演示| Php演示

这里有一个选项,使用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="[^"]+")/', "$2 $3 $1", $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"]

我们匹配并捕获括号内条目的前三个术语,然后用您想要的顺序进行替换。

您可以通过多种方式来实现,例如使用regex在分解字符串后重新排序等等。这是我的一种非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

最新更新