2012-03-30 6 views
4

У меня есть ID.txt файл, который выглядит следующим образом:PHP изменить 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); 
?> 

Может кто-то помочь мне FILLE пробелы?

+0

Попробуйте разбить имя файла на «_» и из этого результата (это массив), вы должны получить 1 индекс. – Tobi

+1

Вы просто хотите ПОЛУЧИТЬ строку между двумя первыми символами подчеркивания, или вы действительно хотите отредактировать файл? – ghoti

+0

Вы обязуетесь использовать PHP для анализа файла в нужном вам формате? Было бы хорошо с 'awk -F" _ "'...''для предварительной обработки файла в формате довольно легко, а затем файл PHP, чтобы прочитать его уже обработаны? –

ответ

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

Не большое дело, но $lines может быть лучше имя переменной там вместо от $parts.

Если вам не нужно писать это обратно в файл, вы можете сделать это:

ob_start(); 
// code used above 
$new_content = ob_get_clean(); 
file_put_contents("ID.txt", $new_content); 

Соответствующие ссылки:

+0

Это не изменяет файл, который запросил ОП. – ghoti

+0

My downvote удален, но кто-то еще вас не любит. :) – ghoti

+0

Мне нужно удалить все после второго символа подчеркивания, а не третьего ... потребовалось бы просто повторить строку array_pop? – Sweepster

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 
+0

это не изменяет файл вообще –

+0

@andreas, поэтому вы хотите, чтобы я отдал домой весь код, и он скопировал его, не изучив ни одного бита? –

+0

@Shiplu hey не нужно, чтобы получить все оборонительные, я просто говорю вам, что требует OP, там удалил мой downvote –

0

Попробуйте

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

$ матчей [2] дает искомой строки

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"); 
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 соответственно.

Смежные вопросы