views:

580

answers:

3

Hi there!

I'm trying to get file contents, replace some parts of it using regular expressions and preg_replace and save it to another file:

$content = file_get_contents('file.txt', true);

$content_replaced = preg_replace('/\[\/m\]{1}\s+(\{\{.*\}\})\s+[\x{4e00}-\x{9fa5}]+/u', 'replaced text', $contents);


if ($content_replaced) {
  file_put_contents('file_new.txt', $content_replaced);
  echo "Successful!";
}
else {
  echo "Some error ocurred";
}

this piece of code works fine with small files, but when I try the original file, which is about 60Mb, it just keeps giving me a message "Some error ocurred".

Any suggestions are greatly appreciated.

Update. No errors in the logs, memory limit is set to 1024M

+1  A: 

You're probably running out of memory. What's the memory_limit set to? (phpinfo() will tell you). You may be able to increase the memory limit like:

ini_set('memory_limit','128M');
timdev
A: 

could it also possibly be script max time limit?

dusoft
+1  A: 

I'm pretty sure you're hitting some regex limit. Heck, some time ago I hit a limit with 1000 chars... with 60Mb of input I bet you will likely hit regex limits everywhere also with really simple patterns. I will try at least to simplify it as much as possible, making it ungreedy with .*? instead of .* if possible.

To get more information, just check the return value of preg_last_error().

ntd
The problem was - PREG_BAD_UTF8_ERROR. My files (the small and the large one) had different encodings. Thanks for pointing me to the right track.
Josh
You're welcome. But, just for curiosity, after correcting the encoding issue, are you able to parse a 60Mb file with the above regex?
ntd