Точная замена строки (предложения или слова) в длинном файле

Я хотел бы заменить предложения кодом в большом файле. Я пытался использовать str_replace, но поскольку в файле есть некоторые из тех же слов предложения, мой код заменяет их и не распознает предложение!

<?php
// sentences,txt
// 12345Temple of Cheope
// ..........
// 99999Cheope

set_time_limit(0);
$GetCodice=@fopen("sentences.txt", "r");
if ($GetCodice) {
while(!feof($GetCodice)) {
    $StoreCodice=fgets($GetCodice,4096);
    $codice='".'.substr($StoreCodice, 0, 6).'."';  // abcd
    $msg=trim(substr($StoreCodice, 6));  // abcd
    echo $msg."<br>";
    $n=0;
            $file = 'longfile.php';
            replace_file($file, $msg, $codice);
   }
   fclose($GetCodice);
}

// From https://stackoverflow.com/questions/2159059/string-replace-in-a-large-file-with-php
function replace_file($path,$string, $replace)
{
    set_time_limit(0);

    if (is_file($path) === true) 
    {
        $file = fopen($path, 'r');
        $temp = tempnam('./', 'tmp');

        if (is_resource($file) === true)
        {
            while (feof($file) === false)
            {
            file_put_contents($temp, str_replace($string, $replace, fgets($file)), FILE_APPEND);
            }

            fclose($file);
        }
        unlink($path);
    }
    echo $replace."<BR>";
     return rename($temp, $path);
}           
?>

Предложения упорядочены по убыванию их длины. Я думал, что этот порядок позволит избежать замены более короткого предложения или слова в более длинном предложении. Я ожидаю выхода

12345
.....
99999

но фактический результат

Temple of 9999
.....
99999

Могу ли я получить некоторую помощь?

заранее спасибо


php
person nino_user183677    schedule 25.05.2019    source источник
comment
Привет, что ты имеешь в виду под предложениями? ты имеешь в виду линии? если да, то дайте мне знать, хотите ли вы заменить одну строку своим кодом или все строки?   -  person sohaieb azaiez    schedule 25.05.2019
comment
Я имею в виду просто предложение (я люблю Мэри, она меня не любит и т. д.), в строке может быть много предложений или кода.   -  person nino_user183677    schedule 25.05.2019
comment
Вы имеете в виду, что хотите заменить, например: 12345Temple 12345Temple 12345Temple 99999Cheope на это? : 12345 12345 12345 99999 ?   -  person sohaieb azaiez    schedule 25.05.2019
comment
Я хочу заменить каждое вхождение Cheope на 9999 и Temple of Cheope на 12345. С моим кодом я получаю 99999 и Temple of 99999! и я должен использовать PHP   -  person nino_user183677    schedule 26.05.2019


Ответы (1)


судя по тому, что вы сказали и что я понял от вас, это то, что вам нужно:

set_time_limit( 0 );
//  Initialization
$inputfile           = "sentences.txt";
$outputFile          = 'longfile.php';
$matches             = array();
$extractedNumbers    = array();
$numberOfLines       = count( file( $inputfile ) );
$numberOfReadedLines = 1; // this will be used to check if the counter is on the last line or not;
//  Implementation
$GetCodice  = @fopen( $inputfile, "r" );
$newfile    = @fopen( $outputFile, 'w+' );
if ( $GetCodice ) {
    while ( ( $line = fgets( $GetCodice ) ) !== false ) {
        preg_match( '/^[0-9]+/m', $line, $matches );
        array_push( $extractedNumbers, $matches[0] );
        $position = sizeof( $extractedNumbers ) - 1;
        if ( $numberOfReadedLines == $numberOfLines ) { // if the counter is in the last line then we don't need to write a new empty line with the "\r"
            $newOutputLine = $extractedNumbers[ $position ];
        } else {
            $newOutputLine = $extractedNumbers[ $position ] . "\r";
        }
        fwrite( $newfile, $newOutputLine );
        $numberOfReadedLines++;
        //replace_file($file, $msg, $codice);

    }
    fclose( $newfile );
    fclose( $GetCodice );

}

(если это не то, что вам нужно, не стесняйтесь комментировать, мы можем найти улучшения, мне просто нужно больше примеров, чтобы лучше понять ваши потребности)

person sohaieb azaiez    schedule 26.05.2019
comment
Спасибо большое. К сожалению, это не работает. Я не понимаю, где предложения из входного файла (sentences.txt) ищутся и заменяются в строках выходного файла (longfile.php). Я получаю сообщение об ошибке в строке: array_push($extractedNumbers, $matches[0]); - person nino_user183677; 26.05.2019
comment
добро пожаловать, для меня это работает как шарм, так что не могли бы вы вставить сюда сообщение об ошибке, пожалуйста? чтобы объяснить, что я сделал: предложение входного файла ищется по каждой строке в вашем файле с помощью функции preg_match (это функция регулярного выражения). Я использовал ее для извлечения чисел из вашего текущего и помещал его в $matches, чем добавляет его в выходной файл - person sohaieb azaiez; 26.05.2019
comment
Привет, это сообщение об ошибке: Обратите внимание: Неопределенное смещение: 0 в ....\trovasost2.php в строке 16 (т.е. array_push($extractedNumbers, $matches[0]); и длинный файл пуст! - person nino_user183677; 27.05.2019
comment
вы не указали, может ли ваш входной файл содержать предложения без кода? ошибка указывает на то, что есть строка (вероятно, строка 16) не содержит кода, а содержит только буквы - person sohaieb azaiez; 28.05.2019