سؤال

أحاول إجراء استبدال الأحرف المعلمة في PHP ولكن الحصول على نتائج غير تقليدية، تخمين أن أكون لأنني أستخدم سلسلة UTF-8 و Str_Replace لا يمكن التعامل مع سلاسل متعددة البايتات ..

$accents_search     = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'); 

$accents_replace    = array('a','a','a','a','a','a','a','A','A','A','A','A','e','e',
'e','e','E','E','E','E','i','i','i','i','I','I','I','I','oe','o','o','o','o','o','o',
'O','O','O','O','O','u','u','u','U','U','U','c','C','N','n'); 

$str = str_replace($accents_search, $accents_replace, $str);

النتائج التي أحصل عليها:

Ørjan Nilsen -> �orjan Nilsen

نتيجة متوقعة:

Ørjan Nilsen -> Orjan Nilsen

تحرير: لدي معالج الطابع الداخلي الخاص بي المضطربة إلى UTF-8 (وفقا ل MB_INTERNAL_ENCODING ())، أيضا قيمة $ Str هي UTF-8، لذلك من ما يمكنني أن أقوله، كل السلاسل المعنية هي UTF-8. هل يقوم STR_REPLES () بالكشف عن مجموعات char واستخدامها بشكل صحيح؟

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

المحلول

يبدو أن السلسلة لم يتم استبدالها لأن ترميز الإدخال الخاص بك وترميز الملفات.

نصائح أخرى

وفقا لوثائق PHP str_replace. وظيفة آمنة ثنائية، مما يعني أنه يمكن التعامل معه UTF-8 نص مشفر دون أي فقدان البيانات.

من الممكن إزالة دروعيا باستخدام نموذج تطبيع يونيكود د (NFD) وخصائص حرف Unicode.

يحول NFD شيئا مثل "ü" Umlaut من "Latin Small Letter U مع الحميم" (أي خطاب) إلى "حرف صغير لاتيني U" (حرف) و "الجمع بين الحميم" (وليس خطابا).

header('Content-Type: text/plain; charset=utf-8');

$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));

$test = Normalizer::normalize($test, Normalizer::FORM_D);

// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';

echo preg_replace($pattern, '', $test);

انتاج:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn

الطبقة الطبيعية هي جزء من حزمة Intl Pecl.. وبعد (الخوارزمية نفسها ليست معقدة للغاية ولكنها تحتاج إلى تحميل الكثير من تعيينات الشخصية Afaik. كتبت تنفيذ PHP. منذ فترة.)

(أضيف هذا الشهرين في وقت متأخر لأنني أعتقد أنها تقنية لطيفة غير معروفة على نطاق واسع.)

جرب تعريف الوظيفة هذه:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top