我需要使用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