Необходимое решение:
Я работаю с простым PHP-скриптом, который должен:
Я новичок в программировании, и сидел здесь в течение двух дней, пытаясь понять это. Может быть, мелочь, или это может быть совершенно неправильный способ выполнения этой задачи.
Это может быть неправильный способ сделать это, или может быть проблема регулярных выражений? Я действительно не знаю.
Я прошу вас помочь мне с решением.
Информация:
Файл 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));
?>
Это на самом деле очень легко достичь с 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::::::
функция file()
выдает файл в массиве, где каждая строка является элементом массива. Каждое окончание строки (EOL
) входит в элементы. Таким образом, добавление текста к этой строке будет после EOL
и, таким образом, эффективно в начале следующей строки.
Вы можете либо не использовать file()
и взорвать текст самостоятельно на EOL
, Итак EOL
больше не является частью элемента массива. Затем отредактируйте элементы и снова взорвите массив.
Или же fopen()
файл и fread()
через себя. Последний вариант предпочтителен, так как он не загружает весь файл в память сразу.
Я думаю, что проблема в вашем цикле через строки, прочитанные функцией 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
Надеюсь это поможет…