[ad_1]
لدي سلسلة تحتوي على كلمات ورقم روماني واحد أو أكثر من واحد (I) إلى عشرة (X).
أحتاج إلى استبدال هذه الأرقام بأعداد صحيحة.
هذا ما حاولت:
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
لكنه لا يعمل: تم استبدال “VII” بـ “511” بدلاً من “7”.
كيف يمكنني إصلاح ذلك؟
ما حاولت:
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
الحل 2
كما هو موثق في PHP: str_replace – يدوي[^], str_replace()
المباريات من الأول إلى الأخير.
لتفعل ما تريد، عليك أن تضع جميع سلاسل البحث قبل أي بادئة منها، لذلك أمر مثل
IV IX III II I VIII VII VI V X
يجب أن تعمل.
الحل 3
بالإضافة إلى ما ورد أعلاه وتعليقك –
مشكلتك هي أن ‘str_replace’ يقوم بإجراء عمليات الاستبدال بالترتيب الذي تظهر به في المصفوفة الخاصة بك كما هو مذكور أعلاه. يمكنك استخدام الدالة “strtr” (وظيفة PHP strtr[^]) بالإضافة إلى وظيفة استبدال مخصصة لإرجاع الاستبدال الصحيح، وتم اختبارها مع جميع عناصر المصفوفة الموجودة محرر W3Schools[^] –
<!DOCTYPE html> <html> <body> <?php $reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word IX word ..."; function replaceNumerals($matches) { global $reps; return $reps[$matches[0]]; } $str2 = preg_replace_callback('/\b(?:' . implode('|', array_map('preg_quote', array_keys($reps))) . ')\b/', 'replaceNumerals', $str); print_r($str2); ?> </body> </html>
إرجاع “كلمة كلمة 9 كلمة …”
[ad_2]
コメント