PHP Замена строки только на определенных строках - PullRequest
1 голос
/ 28 мая 2020

Сейчас у меня есть такой файл.

[Line 1] Hello
[Line 2] World
[Line 3] Hello World

Я буду sh искать все строки, содержащие «Hello», которые будут строкой 1 и 3.

Затем Я хотел бы изменить в этой строке все варианты «Строка» на «Изменено», чтобы результат был

[Changed 1] Hello
[Line 2] World
[Changed 3] Hello World
  • с нетронутой второй строкой. В настоящее время у меня есть код для поиска всех строк с Hello в них, но я не уверен, как редактировать только эти строки и никакие другие.

Например, приведенный ниже код находит все строки, но также удаляет все в процессе с str_replace, поэтому я знаю, что я ищу не str_replace.

$lines = file("lines.html");
$find = "Hello";
$repl = "Changed";
foreach($lines as $key => $line)
  if(stristr($line, $find)){$line = str_replace("$find","$repl",$line);}

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вот быстрый способ, если $find = "Hello"; и $repl = "Changed";:

$result = preg_replace("/\[Line (\d+\].*?$find.*)/", "[$repl $1", file("lines.html"));
file_put_contents("lines.html", $result);
  • Сопоставьте [Line и захватите () цифры \d одну или несколько +
  • За ним следует что-нибудь .*? затем строка $find, затем что угодно .* захват всего
  • Замените на [ $repl и то, что было захвачено $1
1 голос
/ 28 мая 2020

Чтобы что-либо изменить, вам нужно будет написать новый файл с существующими строками и вновь измененными строками. Вот простой пример

// create a new output file
$out = fopen('test2.txt', 'w');

$input = file("lines.html");
$find = "Hello";
foreach($input as $key => $line){
    $tmp = $line;
    if(stristr($line, $find)){
        $tmp = str_replace('[Line', '[Changed', $line);
        // or if `[Line` can appear more than once in the line
        //$tmp = substr_replace($line, '[Changed', 0, 5);
    }
    fwrite($out, $tmp);
}
fclose($out);

РЕЗУЛЬТАТ

[Changed 1] Hello
[Line 2] World
[Changed 3] Hello World
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...