ماذا تفعل هذه preg_replace_callback في PHP؟ وكيف يمكنني التوقف عن ذلك تسرب الذاكرة؟

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

سؤال

ولقد حصلت على المقطع من التعليمات البرمجية على موقع PHP b2evo أن يفعل ما يلي:

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

وماذا يعني هذا المقطع من التعليمات البرمجية تفعل؟ تخميني هو أنه يستبعد الأحرف أسكي بين 128 و 256، ولكن لا أستطيع أن أكون متأكدا.

وبالإضافة إلى ذلك، كما هو عليه، كل مرة يتم استدعاء هذا قليلا من رمز من داخل صفحة، يخصص PHP ثم لا تصل مجانا 2K الذاكرة. إذا تم استدعاء الدالة 1000+ مرات على الصفحة (هذا يمكن أن يحدث)، ثم تستخدم الصفحة ل2MB إضافية من الذاكرة.

وهذا يسبب مشاكل مع تطبيق الويب الخاص بي. لماذا أنا فقدان الذاكرة، وكيف يمكنني كتابة هذا لذلك أنا لا تحصل على تسرب الذاكرة؟

هل كانت مفيدة؟

المحلول

وليس تجريد حقا، فإنه يستبدل الأحرف عالية أسكي من قبل الهيئات التابعة لها.

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