Почему preg_replace то работает то нет?

Я уже задавал вопрос тут? Почему preg_replace срабатывает не всегда?

$content = fopen("test.txt", "r");
$content=fread($content, filesize("test.txt"));
echo preg_replace('@http(.*?)/uploads/(.*?).jpg@', 'http$1/uploads/$2.webp', $content);
file_put_contents("test2.txt", $content);

Вроде ответили, но не работает на больших кусках БД, не понимаю почему. Может всё таки из за кириллицы, хотя в запросах нет кириллицы. http://sofuwa.ru/demo/ - запуск скрипта. http://sofuwa.ru/demo/test.txt Можете у себя проверить.

И в зависимости от размера примера то работает echo то нет, то пустой экран, все ошибки включены, вообще не понятно почему и вы попробуйте не в сервисах для теста запросов, а в реальном скрипте, я пробовал на двух разных хостингах, не работает.

Иногда когда тестовый пример меньше, первые два не срабатывают, остальные замены срабатывают, когда больше кусок, вообще не работает. Представления не имею почему.

Нужно замену сделать, даже через notepad++ пытался

http(.*?)/uploads/(.*?).jpg
http/\1/uploads/\2.webp

не срабатывает почему то


Ответы (1 шт):

Автор решения: Eugene Bocharov

При большом размере файла, как у вас, лучше читать и обрабатывать файл построчно. Например так:

$source = new SplFileObject('test.txt');
$result = new SplFileObject('test2.txt', 'w');
while (!$source->eof()) {
  $row = preg_replace('@(http[^"\' ]*/uploads/[^"\' ]*)\.jpe?g@i', "$1.webp", $source->fgets());
  $result->fwrite($row);
}

Само регулярное выражение я немного изменил, т.к. при использовании (.*?) выражение может работать не корректно, если в путях содержащих /uploads/ кроме файлов jpeg есть и файлы с другими расширениями.

И обратите внимание, что preg_replace не изменяет исходную строку, а возвращает измененное значение. По-этому вы в своем коде записываете в файл test2.txt не измененную строку $content

→ Ссылка