Почему он добавляет текст в начале следующей строки, а не в конце правой?

Необходимое решение:

Я работаю с простым PHP-скриптом, который должен:

  1. Добавьте «value4 :::» в конце первой строки в файле
  2. Добавьте «:::» в конце всех следующих строк

Я новичок в программировании, и сидел здесь в течение двух дней, пытаясь понять это. Может быть, мелочь, или это может быть совершенно неправильный способ выполнения этой задачи.

Это может быть неправильный способ сделать это, или может быть проблема регулярных выражений? Я действительно не знаю.

Я прошу вас помочь мне с решением.


Информация:

Файл newstest.db выглядит так:

ID:::value1:::value2:::value3:::
1:::My:::first:::line:::
2:::My:::second:::line:::
3:::Your:::third:::line:::

И используя этот php-скрипт, я бы хотел, чтобы он выглядел так:

ID:::value1:::value2:::value3:::value4:::
1:::My:::first:::line::::::
2:::My:::second:::line::::::
3:::Your:::third:::line::::::

Проблема:

До сих пор я почти получил его, но я не понимаю, почему он добавляет «value4 :::» к начало из второй и затем добавьте «:::» в начале (а не в конце) всех остальных строк.

Итак, я получаю файл, который выглядит так:

ID:::value1:::value2:::value3:::
value4:::1:::My:::first:::line:::
:::2:::My:::second:::line:::
:::3:::Your:::third:::line:::

Я думал так:

$lineshere = 'Some text here:::';
$lines1 = $linehere.'value4:::';

вывел бы «Некоторый текст здесь ::: value4 :::»

Может быть, проблема связана с этим способом добавления строки за строкой?

$lines = '';
$lines.= 'My test';
$lines.= ' is here';
echo $lines;

Я новичок в программировании, поэтому я мог бы использовать совершенно неправильные функции, чтобы заставить эту работу.

Но в этом случае шов добавить пробел или разрыв строки / конец строки не в том месте.


Моя попытка на это решение:

<?php
// specify the file
$file_source="newstest.db";

// get the content of the file
$newscontent = file($file_source, true);

//set a start value (clear memory)
$lines ='';

// get each line and treat it line by line.

foreach ($newscontent as $line_num => $linehere) {

// add "value4:::" at the end of FIRST line only, and put it in memory $lines
if($line_num==0) {
$lines.= $linehere.'value4:::';

// Just to see what the line looks like
//echo 'First line: '.$lines.'<br /><br />';
}

// then add ":::" to the other lines and add them to memory $lines
if($line_num>0) {
$lines1 = $linehere.':::';
$lines.= $lines1;

//just look at the line
//echo 'Line #'.$line_num.': '.$lines1.'<br /><br />';
}
}

//Write new content to $file_source
$f = fopen($file_source, 'w');
fwrite($f,$lines);
fclose($f);

echo "// to show the results ar array<br /><br />";

$newscontentlook = file($file_source, true);
print_r(array_values($newscontentlook));
?>

3

Решение

Это на самом деле очень легко достичь с file_get_contents а также preg_replace, то есть:

$content = file_get_contents("newstest.db");
$content = preg_replace('/(^ID:.*\S)/im', '$1value4:::', $content);
$content = preg_replace('/(^\d+.*\S)/im', '$1:::', $content);
file_put_contents("newstest.db", $content);

Выход:

ID:::value1:::value2:::value3:::value4:::
1:::My:::first:::line::::::
2:::My:::second:::line::::::
3:::Your:::third:::line::::::

Ideone Demo

2

Другие решения

функция file() выдает файл в массиве, где каждая строка является элементом массива. Каждое окончание строки (EOL) входит в элементы. Таким образом, добавление текста к этой строке будет после EOLи, таким образом, эффективно в начале следующей строки.

Вы можете либо не использовать file() и взорвать текст самостоятельно на EOL, Итак EOL больше не является частью элемента массива. Затем отредактируйте элементы и снова взорвите массив.

Или же fopen() файл и fread() через себя. Последний вариант предпочтителен, так как он не загружает весь файл в память сразу.

2

Я думаю, что проблема в вашем цикле через строки, прочитанные функцией file ():

foreach ($newscontent as $line_num => $linehere) {
...

$linehere в конце содержит символ новой строки, поэтому перед его использованием следует просто нарезать его:

foreach ($newscontent as $line_num => $linehere) {
$linehere = chop($linehere);
...

Если вы этого не сделаете chop содержимое строки, когда вы присоединяете к ней строку, вы получите:

LINE_CONTENTS\nSTRING_ADDED

который при печати будет:

LINE_CONTENTS
STRING_ADDED

Надеюсь это поможет…

1
По вопросам рекламы [email protected]