что делает этот 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);

Что делает этот раздел кода? Я предполагаю, что он удаляет символы ascii между 128 и 256, но я не уверен.

Кроме того, в настоящее время каждый раз, когда этот бит кода вызывается изнутри страницы, PHP выделяет, а затем не освобождает до 2 КБ памяти. Если функция вызывается 1000+ раз на странице (это может произойти), то страница использует дополнительные 2 МБ памяти.

Это вызывает проблемы с моим веб-приложением. Почему я теряю память и как мне переписать ее, чтобы не было утечки памяти?

Это было полезно?

Решение

На самом деле не зачистка, она заменяет символы с высоким 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 ( & amp; #xxx; )

В вашем случае намного проще использовать preg_replace с флагом / e :

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord(<*>).";"',
    $content);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top