이 preg_replace_callback은 PHP에서 무엇을합니까? 그리고 메모리 누출을 어떻게 막을 수 있습니까?

StackOverflow https://stackoverflow.com/questions/295690

문제

B2EVO PHP 사이트에 다음을 수행하는 코드 섹션이 있습니다.

$content = preg_replace_callback(
    '/[\x80-\xff]/',
    create_function( '$j', 'return "&#".ord($j[0]).";";' ),
    $content);

이 코드 섹션은 무엇을합니까? 내 생각에 128에서 256 사이의 ASCII 문자를 제거하지만 확실하지 않습니다.

또한,이 코드가 한 페이지 내에서 호출 될 때마다 PHP는 할당 된 다음 2k의 메모리를 자유롭게하지 않습니다. 함수가 페이지에서 1000 배 이상이라고 불리는 경우 (이 경우 발생할 수 있습니다) 페이지는 추가 2MB의 메모리를 사용합니다.

이것은 내 웹 응용 프로그램에 문제가 발생합니다. 메모리를 잃어 버리는 이유는 무엇이며 메모리 누출을 얻지 못하도록 어떻게 다시 작성합니까?

도움이 되었습니까?

해결책

실제로 스트리핑하지 않고, 높은 ASCII 캐릭터를 엔터티의 대체합니다.

보다 preg_replace_callback.
Create_function은 익명 기능을 만드는 데 사용되지만 대신 일반 기능을 사용할 수 있습니다.

$content = 'Çà ! Nœm dé fîçhïèr tôrdù, @ pöür têstër... ? ~ Œ[€]';
$content = preg_replace_callback('/[\x80-\xff]/', 'CB_CharToEntity', $content);
echo $econtent . '<br>';
echo htmlspecialchars($content) . '<br>';
echo htmlentities($content) . '<br>';
echo htmlentities($content, ENT_NOQUOTES, 'cp1252') . '<br>';

function CB_CharToEntity($matches)
{
    return '&#' . ord($matches[0]) . ';';
}

편집]은 일을하는 더 깨끗하고 빠른 방법을 찾았습니다! ^ _^ 요구에 맞는 옵션과 함께 htmlentities를 사용하십시오.

다른 팁

이것의 create_function 그것은 당신의 기억을 유출합니다 - 대신 일반 기능을 사용하면 괜찮을 것입니다.

함수 자체는 문자를 숫자 HTML 엔티티로 대체합니다.&#xxx;)

사용하기가 훨씬 간단합니다 preg_replace 이랑 /e 귀하의 경우에 플래그 :

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord($0).";"',
    $content);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top