PHP preg_match библейский формат

Я борюсь с созданием регулярного выражения для синтаксического анализа таких строк (библейских писаний):

'John 14:16–17, 25–26' 'John 14:16–17' 'John 14:16' 'John 14' 'John' 

Итак, основной шаблон:

Book [[Chapter][:Verse]]

где глава и стих не являются обязательными.

Попробуйте это здесь

 \b[a-zA-Z]+(?:\s+\d+)?(?::\d+(?:–\d+)?(?:,\s*\d+(?:–\d+)?)*)? 

Смотрите и протестируйте его здесь, в Regexr

Из-за (?:,\s*\d+(?:–\d+)?)* В конце вы можете иметь список стихов, стихи варьируются в конце.

Я думаю, что это делает то, что вам нужно:

 \w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})? 

Предположения:

  • Цифры всегда находятся в наборах 1 или 2 цифр
  • Черточка будет соответствовать любому из следующих - и

Ниже приведено регулярное выражение с комментариями:

 " \w # Match a single character that is a “word character” (letters, digits, and underscores) + # Between one and unlimited times, as many times as possible, giving back as needed (greedy) \s # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) ? # Between zero and one times, as many times as possible, giving back as needed (greedy) ( # Match the regular expression below and capture its match into backreference number 1 \d # Match a single digit 0..9 {1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy) )? # Between zero and one times, as many times as possible, giving back as needed (greedy) ( # Match the regular expression below and capture its match into backreference number 2 : # Match the character “:” literally \d # Match a single digit 0..9 {1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy) )? # Between zero and one times, as many times as possible, giving back as needed (greedy) ( # Match the regular expression below and capture its match into backreference number 3 [-–] # Match a single character present in the list “-–” \d # Match a single digit 0..9 {1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy) )? # Between zero and one times, as many times as possible, giving back as needed (greedy) ( # Match the regular expression below and capture its match into backreference number 4 , # Match the character “,” literally \s # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) \d # Match a single digit 0..9 {1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy) [-–] # Match a single character present in the list “-–” \d # Match a single digit 0..9 {1,2} # Between one and 2 times, as many times as possible, giving back as needed (greedy) )? # Between zero and one times, as many times as possible, giving back as needed (greedy) " 

И вот несколько примеров его использования в php:

 if (preg_match('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject)) { # Successful match } else { # Match attempt failed } 

Получить массив всех совпадений в заданной строке

 preg_match_all('/\w+\s?(\d{1,2})?(:\d{1,2})?([-–]\d{1,2})?(,\s\d{1,2}[-–]\d{1,2})?/', $subject, $result, PREG_PATTERN_ORDER); $result = $result[0]; 

Используйте это регулярное выражение:

 [A-Za-z]+( ([0-9]+)(:[0-9]+)?([\-–][0-9]+)?(, [0-9]+[\-–][0-9]+)?)? 

Или в своей «красивой» версии:

 \w+( (\d+)(:\d+)?([\-–]\d+)?(, \d+[\-–]\d+)?)? 

ОБНОВЛЕНО: для сопоставления тире или дефиса


ПРИМЕЧАНИЕ. Я тестировал его и соответствует всем 5 возможным версиям.

Пример: http://regexr.com?30h4q

введите описание изображения здесь

 ([1|2|3]?([i|I]+)?(\s?)\w+(\s+?))((\d+)?(,?)(\s?)(\d+))+(:?)((\d+)?([\-–]\d+)?(,(\s?)\d+[\-–]\d+)?)? 

работает почти для каждой книги …

  (\b[a-zA-Z]\w+\s\d+)(:\d+)+([-–]\d+)?([,;](\s)?(\d+:)?\d+([-–]\d+)?)? 

Это гибрид всего кода, представленного здесь. Единственными форматами, которые он не будет выделять, являются « только имя книги » или «только книга и глава » (просто добавьте « : 1-all » после главы #). Я обнаружил, что другие коды предоставили для того, чтобы квалифицировать слишком много вариаций, а не в соответствии с библией синтаксис стихов.

Это примеры, которые я тестировал в RegExr: (пока не удается отправить изображения)

Джон humbolt 14: 16-17, 25-26
Иоанн 14: 16-17
Иоанна 14:16
Иоанна 77: 3; 2: 9-11
Иоанн 5: 1-все брэд 555-783-6867
Джон 6
Привет, как ты
Ездра 32: 5 Иоанна 14: 16-17, 25-36
12 23:34
Иоанн 14: 16-17,25-36
Иоанна 14: 16-17; 32:25