2010-06-09 14 views

Respuesta

39

Uno de los enfoques que se pueden utilizar en archivos más pequeños que pueden caber en su memoria dos veces:

$data = file('myfile'); // reads an array of lines 
function replace_a_line($data) { 
    if (stristr($data, 'certain word')) { 
    return "replaement line!\n"; 
    } 
    return $data; 
} 
$data = array_map('replace_a_line',$data); 
file_put_contents('myfile', implode('', $data)); 

Una nota rápida, PHP> 5.3.0 es compatible con las funciones lambda para que pueda quitar la declaración de la función llamada y acortar el mapa para:

$data = array_map(function($data) { 
    return stristr($data,'certain word') ? "replacement line\n" : $data; 
}, $data); 

teóricamente podría hacer de esto una sola (más difícil de seguir) declaración php:

file_put_contents('myfile', implode('', 
    array_map(function($data) { 
    return stristr($data,'certain word') ? "replacement line\n" : $data; 
    }, file('myfile')) 
)); 

Otro enfoque (menos intensivo de memoria) que se debe utilizar para archivos más grandes:

$reading = fopen('myfile', 'r'); 
$writing = fopen('myfile.tmp', 'w'); 

$replaced = false; 

while (!feof($reading)) { 
    $line = fgets($reading); 
    if (stristr($line,'certain word')) { 
    $line = "replacement line!\n"; 
    $replaced = true; 
    } 
    fputs($writing, $line); 
} 
fclose($reading); fclose($writing); 
// might as well not overwrite the file if we didn't replace anything 
if ($replaced) 
{ 
    rename('myfile.tmp', 'myfile'); 
} else { 
    unlink('myfile.tmp'); 
} 
+0

Thanq ..... Está funcionando bien – kishore

+0

El enfoque menos intensivo en memoria es exactamente lo que necesitaba (simple y fácil de entender) ..... ¡¡¡GRACIAS !!! – scottcarmich

5

Usted tiene que sobrescribir el archivo completo.

Por lo tanto, para el archivo relativamente pequeño, read file into array, busque la palabra, reemplace la fila encontrada, escriba all the rest en file.

Para el archivo grande, el algoritmo es levemente diferente, pero es bastante similar en general.

parte importante es file locking

por eso preferimos una base de datos.

+0

+1 para la nota sobre 'rebaño()' – gnarf

2
$filedata = file('filename'); 
$newdata = array(); 
$lookfor = 'replaceme'; 
$newtext = 'withme'; 

foreach ($filedata as $filerow) { 
    if (strstr($filerow, $lookfor) !== false) 
    $filerow = $newtext; 
    $newdata[] = $filerow; 
} 

Ahora $newdata contiene el contenido del archivo como una matriz (implode() utilizar si no quiere matriz) con la línea que contiene "replaceme" sustituido por "withme".

3

También puede utilizar el modo multi-línea con expresiones regulares

preg_match_all('/word}/m', $textfile, $matches); 

esto es, por supuesto, asumiendo que es un documento más pequeño en la lista y se carga. De lo contrario, las otras respuestas son mucho más 'mundo real' de una solución.

0

Tal vez esto podría ayudar:

$data = file("data.php"); 

for($i = 0;$i<count($data);$i++){ 
    echo "<form action='index.php' method='post'>"; 
    echo "<input type='text' value='$data[$i]' name='id[]'><br>"; 
} 

echo "<input type='submit' value='simpan'>"; 
echo "</form>"; 

if(isset($_POST['id'])){ 
    file_put_contents('data.php',implode("\n",$_POST['id'])) ; 
} 
1

Esto es bueno si usted está buscando una subcadena (ID) en una línea y desea reemplazar la antigua línea con la nueva línea.

Código:

$id = "123"; 
$new_line = "123,Programmer\r"; // We're not changing the ID, so ID 123 remains. 
$contents = file_get_contents($dir); 
$new_contents= ""; 
if(strpos($contents, $id) !== false) { // if file contains ID 
    $contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents); 
    foreach ($contents_array as &$record) { // for each line 
     if (strpos($record, $id) !== false) { // if we have found the correct line 
      $new_contents .= $new_line; // change record to new record 
     }else{ 
      $new_contents .= $record . "\r"; 
     } 
    } 
    file_put_contents($dir, $new_contents); // save the records to the file 
    echo json_encode("Successfully updated record!"); 
} 
else{ 
    echo json_encode("failed - user ID ". $id ." doesn't exist!"); 
} 

Ejemplo:

archivo antigua:

ID, ocupación

123, estudiante

124, capa de ladrillo

ejecutar el código cambiará archivo a:

Nueva archivo:

ID, ocupación

123, programador

124, ladrillo capa

Cuestiones relacionadas