2014-09-23 3 views
0

Текстовый файл (text.txt):Как изменить строку из текстового файла (PHP)

#Minecraft server properties 
#Tue Sep 23 18:07:26 CEST 2014 
generator-settings= 
op-permission-level=4 
allow-nether=true 
level-name=world 
enable-query=true 
allow-flight=false 
announce-player-achievements=true 
server-port=25565 
query.port=25565 
level-type=DEFAULT 
enable-rcon=false 
force-gamemode=false 
level-seed= 
server-ip= 
max-build-height=256 

Как заменить значение некоторой линии, например, такие:

server-port=25565 

заменить на:

server-port=25585 

Но не найти «сервер-порт = 25565» и замените «сервер-порт = 25585» Установлено, что т он строит в нем порт сервера и выделяет значение, которое необходимо заменить.

Пример:

<?php 
    $myfile = fopen("text.txt", "r") or die("Unable to open file!"); 
    ... 
    fclose($myfile); 
?> 

EDIT: И когда finded это и сохраняется заменить текстовый файл.

+0

Используйте [ 'stripos()'] (http://php.net/manual/en/function.stripos.php) –

+0

[str_replace()] (http://php.net/manual/ ru/function.str-replace.php) должен работать? – EricSSH

+0

@EricSSH Не всегда одинаковое значение сервера-порта, я хочу найти «сервер-порт» и заменить значение. – FilipET

ответ

2

Поскольку ваш формат выглядит подозрительно, как файл конфигурации PHP (.ini), почему бы не использовать parse_ini_file функция?

$ini = parse_ini_file("text.txt"); 
echo "<pre>".print_r($ini,TRUE)."</pre>"; 

или

echo $ini["server-port"]; 

Изменить его:

$ini["server-port"] = 25585; 

Сохранить снова файл .txt с:

$f = fopen("text.txt","w"); 
foreach($ini as $k=>$v) { 
    fwrite($f,$k."=".$v.PHP_EOL); 
} 
fclose($f); 

Вы, возможно, потребуется изменить # комментарии символ, хотя с ;

UPDATE

$lines = file("text.txt",FILE_IGNORE_NEW_LINES); 
// modify 
foreach($lines as &$line) { 
    $val = explode("=",$line); 
    if ($val[0]=="server-port") { 
     $val[1] = "25585"; 
     $line = implode("=",$val); 
    } 
} 
unset($line); 

// save again 
$f = fopen("text.txt","w"); 
foreach($lines as $line) { 
    fwrite($f,$line.PHP_EOL); 
} 
fclose($f); 
+0

# Свойства сервера Minecraft #Tue Sep 23 18:07:26 CEST 2014 Это удаляется после сохранения и значения «true» и «false» также удаляются. – FilipET

+0

Кажется, что 'parse_ini_file' удаляет булевы. Вы можете изменить на '0' или' 1', которые являются альтернативой '.ini' boolean. '#' Создает ошибки, и вы должны использовать ';', который является символом комментария для 'ini' файлов – 2014-09-23 17:33:50

+0

Но это не файл' .ini', это файл конфигурации для сервера minecraft. – FilipET

1

Вы можете использовать strpos() или stripos()

<?php 

$file = "file.txt"; 

$content = file($file); 

foreach ($content as $line_num => $line) { 
    if (false === (strpos($line, 'server-port=25565'))) continue; 

    $content[$line_num] = "server-port=25585\n"; 
} 

file_put_contents($file, $content); 

Перед

 
#Minecraft server properties 
#Tue Sep 23 18:07:26 CEST 2014 
generator-settings= 
op-permission-level=4 
allow-nether=true 
level-name=world 
enable-query=true 
allow-flight=false 
announce-player-achievements=true 
server-port=25565 
query.port=25565 
level-type=DEFAULT 
enable-rcon=false 
force-gamemode=false 
level-seed= 
server-ip= 
max-build-height=256 

После

 
#Minecraft server properties 
#Tue Sep 23 18:07:26 CEST 2014 
generator-settings= 
op-permission-level=4 
allow-nether=true 
level-name=world 
enable-query=true 
allow-flight=false 
announce-player-achievements=true 
server-port=25585 
query.port=25565 
level-type=DEFAULT 
enable-rcon=false 
force-gamemode=false 
level-seed= 
server-ip= 
max-build-height=256 

Edit

Вы можете изменить $new_port переменную, что вы хотите.

$path = "file.txt"; 
$new_port = 25585; 
$content = file($path); 

foreach ($content as $line_num => $line) { 
    if (false === (strpos($line, 'server-port'))) continue; 

    $content[$line_num] = "server-port=$new_port\n"; 
} 

file_put_contents($path, $content); 
+0

Значение сервера-порта не всегда одинаковое или (25565) – FilipET

+0

@FilipET Итак, просто найдите '25565' и замените' 25585', правильно? –

+0

Нет, мне нужно найти «сервер-порт», а затем извлечь значение «server-port» и заменить его. – FilipET

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