PHP preg_match формат библии - PullRequest
       9

PHP preg_match формат библии

10 голосов
/ 02 апреля 2012

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

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

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

Book [[Chapter][:Verse]]

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

Ответы [ 5 ]

9 голосов
/ 02 апреля 2012

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

\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];
4 голосов
/ 02 апреля 2012

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

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

Посмотрите и протестируйте здесь, на Regexr

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

3 голосов
/ 02 апреля 2012

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

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

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

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

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


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

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

enter image description here

0 голосов
/ 31 августа 2014
   (\b[a-zA-Z]\w+\s\d+)(:\d+)+([-–]\d+)?([,;](\s)?(\d+:)?\d+([-–]\d+)?)?

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

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

Джон Гумбольт 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

0 голосов
/ 23 октября 2013
([1|2|3]?([i|I]+)?(\s?)\w+(\s+?))((\d+)?(,?)(\s?)(\d+))+(:?)((\d+)?([\-–]\d+)?(,(\s?)\d+[\-–]\d+)?)?

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

...