سؤال

لدي رمز PHP التالي في ملف UTF-8 PHP:

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));

أرغب في استبدال Regex الأخير بالكلمات الكاملة فقط وليس أجزاء من الكلمات.

على جهاز الكمبيوتر الخاص بي Windows، يعود:

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)

على خادم الويب (Linux)، أحصل على:

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"

وبالتالي، يعمل Regex كما كنت أتوقع على Windows ولكن ليس على Linux.

وبالتالي فإن السؤال الرئيسي هو، كيف يجب أن أكتب Regex الخاص بي للمطابقة فقط في حدود Word؟

الأسئلة الثانوية هي كيف يمكنني السماح لنظام Windows يعرف أنني أريد استخدام UTF-8 في تطبيق PHP الخاص بي.

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

المحلول

حتى في وضع UTF-8، تخلى الطبقة القياسية مثل \w و \b ليست unicode تدرك. عليك فقط استخدام اختصار Unicode، كما عملت خارج، ولكن يمكنك أن تجعلها أقل قايرة قليلا باستخدام LookRounds بدلا من التنازلات:

/(?<!\pL)weiß(?!\pL)/u

لاحظ أيضا كيف تركت الأقواس المجعد من اختصار الفئة Unicode؛ يمكنك أن تفعل ذلك عندما يتكون اسم الفصل من حرف واحد.

نصائح أخرى

هنا هو ما وجدته حتى الآن. عن طريق إعادة كتابة أنماط البحث واستبدال مثل هذا:

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

أحصل على النتيجة المطلوبة:

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

على كل من جهاز الكمبيوتر الخاص بي Windows يعمل على تشغيل Apache وعلى WebServer Linux المضيف تشغيل Apache.

أفترض أن هناك بعض طريقة أفضل للقيام بذلك.

أيضا، ما زلت أرغب في setlocale كمبيوتر Windows الخاص بي إلى UTF-8.

تخمين أن هذا مرتبط BUG # 52971.

أحرف PCRE-META \b \w لا يعمل مع سلاسل يونيكود.

و ثابت في PHP 5.3.4

ملحق PCRE: علة ثابتة # 52971 (شخصيات PCRE-META لا تعمل مع UTF-8).

وفق هذا التعليق, هذا خطأ في PHP. هل تستخدم \W بدلا من \b إعطاء أي فائدة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top