2012-04-02 34 views
10

Tôi đang phải vật lộn với việc xây dựng một biểu thức chính quy để phân tích loại dây (kinh kinh thánh):PHP preg_match Kinh Thánh Kinh Thánh dạng

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

Vì vậy, mô hình cơ bản là:

Book [[Chapter][:Verse]]

nơi chương và câu là tùy chọn.

+0

Vì vậy, nó phải phù hợp ngay cả khi nó chỉ là tên của cuốn sách? Bạn có danh sách các sách cần khớp không? Nếu không nó sẽ chỉ phù hợp với mọi từ. – JJJ

+0

Chỉ cần phù hợp với bất kỳ từ nào, vấn đề thực sự đối với tôi là có quá nhiều phần tùy chọn. – Dziamid

Trả lời

4

Hãy thử điều này ở đây

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

Xem và thử nghiệm nó here on Regexr

Do (?:,\s*\d+(?:–\d+)?)* lúc kết thúc, bạn có thể có một danh sách các câu, các câu dao động ở cuối.

+0

Bạn là người chung nhất. Tôi chỉ thêm '[-–]' thay vì dấu nối như @Robby được gợi ý và một số dấu ngoặc bắt để làm cho nó hoàn hảo. – Dziamid

3

Sử dụng regex này:

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

Hoặc trong phiên bản của nó 'đẹp':

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

CẬP NHẬT: Để phù hợp với dấu gạch ngang hay dấu gạch ngang


LƯU Ý: Tôi đã thử nghiệm nó và nó khớp với TẤT CẢ 5 phiên bản có thể.

Ví dụ: http://regexr.com?30h4q

enter image description here

9

Tôi nghĩ rằng đây không những gì bạn cần:

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

Giả định:

  • Những con số luôn trong bộ 1 hoặc 2 số
  • Các dấu gạch ngang sẽ phù hợp với một trong hai điều sau đây -

Dưới đây là regex với ý kiến:

" 
\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) 
" 

Và đây là một số ví dụ về việc sử dụng của nó trong 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 
} 

Nhận một mảng của tất cả các kết quả phù hợp trong một chuỗi đã cho

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]; 
+0

Vì vậy, nó sẽ phù hợp với dấu gạch ngang hoặc gạch nối? – Dziamid

+0

vâng, có đúng không? – Robbie

+0

+1 cho điều này, cảm ơn bạn – Dziamid

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

hoạt động cho hầu hết mọi sách ...

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

Đây là sự kết hợp của tất cả các mã được trình bày ở đây. Các định dạng duy nhất nó sẽ không làm nổi bật là "tên sách chỉ" hoặc "cuốn sách & chương chỉ" (chỉ cần thêm ": 1-tất cả" sau chương #) Tôi tìm thấy các mã khác được cung cấp để đủ điều kiện quá nhiều biến thể , không phù hợp với cú pháp câu kinh thánh.

Đây là những ví dụ tôi thử nghiệm trong RegExr: (không thể đăng hình ảnh chưa)

John Humbolt 14: 16-17, 25-26
Giăng 14: 16–17
John 14:16
John 77: 3; 2: 9-11
Giăng 5: 1-tất cả brad 555-783-6867
Giăng 6
hi có how are you
Ezra 32: 5Giăng 14 : 16-17, 25-36
23:34
Giăng 14: 16-17,25-36
Giăng 14: 16-17; 32:25