PHP 修改 TXT 文件

4

我有一个 ID.txt 文件,内容如下:

"http://something.net/something-ak/41389_718783565_1214898307_q.jpg"
"http://something.net/something-ak/372142_106502518141813_1189943482_q.jpg"
and so on

我希望使用PHP打开文件并删除第一个" _ "之前和第二个" _ "之后的所有内容,以便得到以下结果:

718783565
106502518141813
and so on

事实上,我并不知道如何做到那一点。

以下是我目前所拥有的内容:

<?PHP
$file_handle = fopen("ID.txt", "rb");

while (!feof($file_handle) ) {

$line_of_text = fgets($file_handle);
$parts = explode('\n', $line_of_text);

// Remove everything before the first "_" and everything after the last "_".
// echo the line
}

fclose($file_handle);
?>

有人能帮我填空吗?


尝试在文件名中使用“_”进行分割,从此结果(它是一个数组)中获取索引1。 - Tobi
1
你是只想获取第一个和第二个下划线之间的字符串,还是真的想编辑文件呢? - ghoti
你是否决定使用PHP将文件解析成所需的格式?如果使用awk -F"_" '...'预处理文件以便更容易地转换为所需格式,然后再使用PHP文件读取已经处理好的文件,这样做是否可以接受? - Yzmir Ramirez
我想获取两个下划线之间的字符串,并在它们之间插入一些行。 - Sweepster
@Yzmir,我不知道你刚才建议的是什么... - Sweepster
5个回答

2

这是我会做的,虽然正则表达式可能更短或更高效:

$file_handle = fopen("ID.txt", "rb");
while (!feof($file_handle) )
{
    $line_of_text = fgets($file_handle);
    $parts = explode("\n", $line_of_text);

    foreach ($parts as $str)
    {
        $str_parts = explode('_', $str); // Split string by _ into an array
        array_shift($str_parts); // Remove first element
        echo current($str_parts)."\n"; // echo current element and newline
        // Same as $str_parts[0]
    }
}
fclose($file_handle);

演示:http://codepad.org/uFbVDtbR 这不是什么大问题,但是在那里 $parts 可能不是一个很好的变量名,$lines 可能更好。
如果你需要将此写回文件,可以这样做:
ob_start();
// code used above
$new_content = ob_get_clean();
file_put_contents("ID.txt", $new_content);

相关参考资料:


这不会修改文件,这也是 OP 请求的内容。 - ghoti
我的踩已经被取消了,但是可能有其他人不喜欢你。 :) - ghoti
我需要删除第二个下划线后的所有内容,而不是第三个...这是否涉及简单地重复array_pop行? - Sweepster
我看到了,我应该读你的示例输出(现在-1有意义了,我以为你想要第一个和最后一个下划线之间的所有内容)。等一下,我会修复的。 - Wesley Murch

2
在循环中使用file
$content = "";
foreach(file("ID.txt", FILE_SKIP_EMPTY_LINES) as $line){
    $parts = explode('_', $line);
    $content .=  $parts[1] . "\n";
}
file_put_contents("ID.txt", $content);

如果你想要通过 来实现这个功能,
awk -F _ '{print $2}' ID.txt

这并不会对文件进行任何修改。 - Andreas Wong
@andreas,所以你希望我将整个代码交给他,而他却不学习一点内容就抄袭了吗? - Shiplu Mokaddim
@Shiplu 嘿,不用那么防御,我只是告诉你 OP 需要什么,已经取消了我的踩。 - Andreas Wong
@Madmartigan 很好的发现。已经修复了。 - Shiplu Mokaddim

0

试试这个

preg_match('/(.*?)(.+?)(.*)/',$line,$matches);

$matches[2] 将会返回所需的字符串


0
$TXT = file_get_contents(__DIR__.'/in.txt');
$NewTXT = preg_replace('~^.+/[0-9]+_([0-9]+)_.+?$~mi', '$1', $TXT);
file_put_contents(__DIR__.'/out.txt', $NewTXT);

只需相应地重命名 .txt 文件。


0

这应该可以工作

<?php
// open files
$file_handle = fopen("ID.txt", "rb");
$new_file_handle = fopen("ID2.txt", "wb");

while (!feof($file_handle) ) {
  $str = fgets($file_handle);
  $start = strpos($str, '_'); // find first "_"
  $end = strpos($str, '_', $start + 1); // find next "_"
  $newstr = substr($str, $start + 1, $end - $start - 1) . "\n";
  fputs($new_file_handle, $newstr);
}
// close files
fclose($file_handle); 
fclose($new_file_handle);
// rename
rename("ID2.txt", "ID.txt");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接