Как проверить предложения с римскими цифрами php

#php

#php

Вопрос:

У меня есть предложения для заголовка breadcrumb, например Code01 - HISTORY LESSON II - Class A . Мне нужно, чтобы эти предложения HISTORY LESSON II стали History Lesson II . Я попытался strtolower сначала использовать функцию, а затем ucwords , как показано ниже

 $data = ucwords(strtolower($lesson_name));
  

и предложения становятся History Lesson Ii . Знаете ли вы, как проверить, есть ли в предложениях римские цифры, и если есть, то только в римских цифрах, не измененных на strtolower ?

Спасибо

Ответ №1:

Если вы запустите код так, как он у вас есть… Вы можете использовать then preg_replace_callback для сопоставления римских цифр и возврата их в верхнем регистре.

Код

 $string = "Code01 - HISTORY LESSON II - Class A";        // Subject string
$string = ucwords(strtolower($string));                  // Set sentence to Title Case

echo preg_replace_callback(
    "/(b[ivx] )b/i",                                   // Pattern to match Roman Numberals; case insensitive
    function($matches){return strtoupper($matches[1]);}, // Function to return numerals in uppercase
    $string                                              // Subject to run pattern against
);
  

Ответ №2:

Вы также можете использовать preg_match_all и array_map .

 $string = "Code01 - HISTORY LESSON II - Class A";
$string = ucwords(strtolower($string));
$pattern = '/b(?:X?L?(?:X{0,3}(?:IX|IV|V|V?I{1,3})|IX|X{1,3})|XL|L)b/i';
preg_match_all($pattern,$string,$matches);
$upper = array_map('strtoupper',$matches[0]);

echo str_replace($matches[0],$upper,$string);
  

Вывод с:

 Code01 - History Lesson II - Class A