为什么它会在下一行的开头添加文本,而不是在右边的那一行添加?

时间:2016-04-28 09:51:03

标签: php regex flat-file

需要解决方案:

我正在使用一个简单的PHP脚本:

  1. 添加" value4 :::"在文件第一行的末尾
  2. 添加" :::"在所有下一行的末尾
  3. 我是编程的新手,并且已经坐了两天试图解决这个问题。可能是一个小细节,或者它可能是完全错误的方式来完成这项任务。

    这可能是错误的方法,或者可能是正则表达式问题?我真的不知道。

    我恳请您帮我解决问题。

    信息:

    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;
    

    我是编程方面的新手,所以我可能使用完全错误的函数tec来完成这项工作。

    但在这种情况下,接缝会在错误的位置添加空格或换行符/换行符。

    我尝试使用此解决方案:

    <?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 个答案:

答案 0 :(得分:2)

函数file()为您提供数组中的文件,每行都是数组的元素。该行(EOL)的每个结尾都包含在元素中。因此,在该行附加文本将在EOL之后,因此有效地在下一行的开头。

您可以选择不使用file()并在EOL上自行分解文本,因此EOL不再是数组元素的一部分。然后编辑元素,再次内爆数组。

fopen()文件,fread()自己通过它。后一个选项是首选,因为它不会立即将整个文件加载到内存中。

答案 1 :(得分:2)

使用file_get_contentspreg_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 :(得分:1)

我认为问题出在你的循环中,通过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

希望这会有所帮助......