регулярное выражение в php, чтобы найти римские цифры

Я использую PHP, чтобы выделить все roman цифры в строке.

Например:

Protocol XXXIV/14 from session...

Protocol XXIX/13  from session...

Protocol XXXV/13  from session...

Итак, я нашел идеальный пример на http://regexr.com/2uhln. Это хорошо работает для приведенных выше примеров, но когда я пытаюсь использовать его в php, он перестает работать.

Мой код PHP

    $subject = "Protocol XXXV/13  from session...";
$pattern ='/(?:XL|L|L?(?:IX|X{1,3}|X{0,3}(?:IX|IV|V|V?I{1,3})))/';
preg_match($pattern,$subject,$matches);

Он выводит всего 1-3 символа из римской цифры, так что

XXXIV - gives XXX

XXIX - gives XX

XXXV - gives XXX

У меня есть два вопроса:

  1. Что случилось? Как это исправить?
  2. как изменить регулярное выражение из http://regexr.com/2uhln работать для всех римских цифр до ста (римский C). Это не работает ex. XLVII, XLVI, XLV.

1

Решение

Измените порядок вашего шаблона. То есть сначала размещайте самый длинный паттерн, а затем средний, наконец, короткий. синтаксис будет как long|medium|short , Так что самая длинная строка будет соответствовать первой.

$re = "~L?(?:X{0,3}(?:IX|IV|V|V?I{1,3})|IX|X{1,3})|XL|L~m";
$str = "Protocol XXXIV/14 from session...\nProtocol XXIX/13 from session...\nProtocol XXXV/13 from session...";
preg_match_all($re, $str, $matches);
print_r($matches);

Обновить:

\b(?:X?L?(?:X{0,3}(?:IX|IV|V|V?I{1,3})|IX|X{1,3})|XL|L)\b

DEMO

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]