2010-02-26 6 views
0

preg_replace 함수를 사용하여 문자열의 악센트를 바꾸려면 UTF-8을 사용하고 있습니다.preg_replace가있는 메모리 누수

I 메모리 누수 것 같다 무엇에 발생했다,하지만 난 근본 원인을 분리 할 수없는, 내 코드는 오히려 간단하다

$aToNoAccents'~[Ą]~u' => 'A', '~[Ć]~u' => 'C', 같은 항목이 연관 배열이
preg_replace(
     array_keys($aToNoAccents), 
     array_values($aToNoAccents), 
     $sText 
    ); 

. 내 스크립트 인쇄 위의 라인이 오류 :

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3039 bytes) 

은 분명히이 PHP를 위해 허용 된 메모리를 증가의 문제가 아니라, (1GB의 풋 프린트 방식으로 떨어져 내 응용 프로그램의 규모입니다). 또한이 라인은 문제없이 수천 번 실행되지만 재현하기 어려운 경우에는 오류가 발생합니다.

누구나 preg_replace 및 UTF-8 문자열의 메모리 문제를 알고 있습니까? 실제 매개 변수를 이러한 함수에 전달할 때 특별히주의해야합니까? 내가 수호신 - 패치

+2

해당 정규식입니까? 그렇지 않으면'str_replace'를 대신 사용하여 더 잘 작동하는지 확인해야합니다. –

+0

예, 어쩌면 정규식이 될 필요는 없습니다. 나는 그것을 시도하고있다 –

답변

3

와 PHP 5.2.6-3를 사용하고

는 교체 맵을 수작업 대신 iconv를 시도?

Original : A String with lots of weird chars, like AC 
TRANSLIT : A String with lots of weird chars, like AC 
IGNORE : A String with lots of weird chars, like AC 
Plain : A String with lots of weird chars, like AC 

를 얻을 것이다 PHP 설명서

$text = "A String with lots of weird chars, like ĄĆ"; 

echo 'Original : ', $text, PHP_EOL; 
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL; 
echo 'IGNORE : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL; 
echo 'Plain : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL; 

에서 예를 적응 그러나 이것은 반드시. 당신이 던져 어떤 문자와 함께 작동 그것을 원하는 키를 사용 해보세요 것입니다하지 않습니다.

+0

그것은 좋은 생각 일 것이다. 그러나 불행하게도 어떤 나라에서는 어떤 캐릭터가 번역되었는지에 대한 완전한 제어권이 필요하다. 그래서 나는 그 작업을 위해 외부 도구를 사용할 수 없다. –

1

내가하지 preg_replace이다과 같은 문제 (메모리 누수)을했고 나는 "듣고"그 아마는 내가 확실하지 오전하지만 PHP와 같은 스크립트를하려고하면 5.0가 작동 할 수 PHP 5.2

버그.

기록 용으로 만 사용하십시오.

+1

PHP에서 알려진 버그가 있으면 http://bugs.php.net/ – Gordon

+0

에서 찾을 수 있습니다. 예, 여기에 버그를 유발하는 링크를 추가 할 수 있습니까? – Till

+1

요청시 preg_replace 캐시에 최대 4096 개의 결과를 제안하는 글이 있습니다. http://blog.killtheradio.net/tricks-hacks/phps-preg-functions-dont-release-memory/ –