Замена текстовых фрагментов местами с использованием php - PullRequest
0 голосов
/ 19 ноября 2018

Мне нужно заменить строки в текстовом файле, используя 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"] ... и т. д.

Я пытаюсь что-то preg_replace заменить, но не очень

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

Я уже знаю, что это не так,Вы можете чем-нибудь помочь?

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Вы можете использовать положительный взгляд назад и 2 группы захвата и заменить на группу 2 и группу 1:

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

Это будет соответствовать

  • (?<=\[prev) Позитивный взгляд, утверждающий, что слева есть [пред
  • ( title="[^"]+") match title = включая двойные кавычки и содержимое в группе 1
  • ( cont="[^"]+" res="[^"]+") match cont = иres = включая двойные кавычки и содержимое в группе 2

Заменить на группу переключения 1 и группу 2.

Regex demo | Php demo

0 голосов
/ 19 ноября 2018

Вы можете сделать это многими способами, например, используя 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"]

DEMO: https://3v4l.org/FE8Xq

0 голосов
/ 19 ноября 2018

Вот один из вариантов, используя 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"]

Мы сопоставляем и фиксируем первые три условия ввода в скобках, а затем формируем замену с желаемым заказом.

...