1

这是我在互联网上的第一篇文章,以寻求编码方面的帮助,所以请多多包涵!几年来,我一直在互联网上找到开放代码并对其进行修改以做我想做的事情,但我似乎遇到了这个问题,我确信它非常简单。如果您能帮助我,将不胜感激。

我有以下页面:

    <?php 
    $text = $_REQUEST['message'];
    $f = file_get_contents("all.txt"); 
    $f = explode(", ", $f); 

    function modFile($pos, $tothis, $inthis)
    { 
        foreach($inthis as $pos => $a){ 
        } 
        $newarr = implode("\r\n", $inthis); 
        $fh = fopen("example.txt", "w"); 
        fwrite($fh, $newarr); 
        fclose($fh); 
    } 

    modFile(4, '', $f); 

我有一个文件(all.txt),其中包含以下内容:

    11111111111, 22222222222, 33333333333, 44444444444

我希望这样显示:

    11111111111 
    22222222222
    33333333333
    44444444444

并在每个数字后添加一个空格,然后在每行上的文本相同的地方添加一些文本:

    11111111111 text here
    22222222222 text here
    33333333333 text here
    44444444444 text here

我有一个 html 表单,它传递要附加到每一行的自定义文本。我需要保持文件 all.txt 完整,然后用不同的名称保存新格式化的文件。

我已经尝试将变量放入我目前拥有“\r\n”的内爆中,但这不起作用。

非常感谢任何帮助。

提前致谢!

4

2 回答 2

2

关于您的代码的一些注意事项:您正在传递$pos给函数,但它会在foreach. 也是foreach空的,那有什么用呢?而且我也没有看到您$text在任何地方使用。

要获得所需的输出,请尝试以下操作:

file_put_contents(
    '/path/to/new.txt',
    preg_replace(
        '/[^\d+]+/',
        ' some text' . PHP_EOL,
        file_get_contents('all.txt')
    )    
);

该模式[^\d+]+将匹配任何不是连续数字的字符串,并将其替换为“some text”和一个新行。

实现相同功能的更复杂的版本是:

file_put_contents(
    '/path/to/new.txt', 
    implode(PHP_EOL, array_map(
        function ($number) {
            $message = filter_var(
                $_POST['message'], FILTER_SANITIZE_SPECIAL_CHARS
            );
            return sprintf('%s %s', trim($number), $message);
        },
        array_filter(str_getcsv(file_get_contents('/path/to/all.txt')))
    )
));

这将(从内到外):

  • 加载 all.txt 的内容并将其作为 CSV 字符串解析到一个数组中。每个数组元素对应一个数字。
  • 这些数字中的每一个都附加了来自 POST 超全局的消息内容(您不想使用 REQUEST)。
  • 然后将生成的数组连接回单个字符串,其中连接字符是换行符。
  • 结果字符串被写入新文件。

如果上面的内容太难理解,这里是一个使用临时变量但没有 lambda 的版本:

$allTxtContent = file_get_contents('/path/to/all.txt');
$numbers = array_filter(str_getcsv($allTxtContent));
$message = filter_var($_POST['message'], FILTER_SANITIZE_SPECIAL_CHARS);
$numbersWithMessage = array();
foreach ($numbers as $number) {
    $numbersWithMessage[] = sprintf('%s %s', trim($number), $message);
};
$newString = implode(PHP_EOL, $numbersWithMessage);
file_put_contents('/path/to/new.txt', $newString);

它做同样的事情。

于 2012-08-11T12:21:50.990 回答
0

您的 foreach() 右括号位于错误的位置。您错过了运行新文件创建执行的确切部分。这里:

$text = $_REQUEST['message'];
$f = file_get_contents("all.txt"); 
$f = explode(", ", $f);
function modFile($pos, $tothis, $inthis, $text){ 
    $fh = fopen("example.txt", "w");
    foreach($inthis as $pos => $a){ 
        $newarr = $a." ".$text."\r\n";
        fwrite($fh, $newarr);
    }
    fclose($fh);
} 
modFile(4, "", $f, $text);

这是为了根据需要格式化新文件,但是,您没有传递要附加到新文件的新 $text['message'] 。您可以修改您的 mod_file() 方法,也可以在运行时在 foreach() 循环中传递它。

编辑* 刚刚更新了整个代码,现在应该是你的目标。如果是,请将答案标记为已接受。

于 2012-08-11T11:44:17.953 回答