PHP متعدد البايت str_replace؟
-
12-09-2019 - |
سؤال
أحاول إجراء استبدال الأحرف المعلمة في 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;
}
}