2012-04-02 9 views
10

मैं तार इस तरह की (बाईबल शास्त्र) पार्स करने के लिए एक नियमित अभिव्यक्ति के निर्माण के साथ संघर्ष कर रहा हूँ:पीएचपी preg_match बाईबल शास्त्र प्रारूप

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

तो बुनियादी पैटर्न है:

Book [[Chapter][:Verse]]

जहां अध्याय और कविता वैकल्पिक है। इस regex

+0

तो यह मेल खाना चाहिए भले ही यह सिर्फ किताब का नाम हो? क्या आपके पास पुस्तकों की एक सूची है जो इसे मेल खाना चाहिए? अन्यथा यह सिर्फ हर शब्द से मेल खाता होगा। – JJJ

+0

बस किसी भी शब्द से मेल खाते हैं, मेरे लिए असली समस्या इतनी सारे वैकल्पिक भागों में है। – Dziamid

उत्तर

4

यहाँ

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

इस प्रयास करें देखें और यह here on Regexr

का परीक्षण क्योंकि अंत में (?:,\s*\d+(?:–\d+)?)* की आप छंद की एक सूची हो सकता है, छंद अंत में हो सकती है।

+0

आपका सबसे सामान्य है। मैंने केवल हाइफ़न के बजाय '[-]' जोड़ा क्योंकि @ रॉबी ने सुझाव दिया और कुछ कैप्चरिंग ब्रैकेट इसे सही बनाने के लिए। – Dziamid

3

उपयोग:

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

या अपनी 'खूबसूरत' संस्करण में:

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

UPDATED: डैश से मेल खाते हैं या हाइफ़न

करने के लिए

नोट: मैंने इसका परीक्षण किया है और यह सभी 5 संभावित संस्करणों से मेल खाता है।

उदाहरण: http://regexr.com?30h4q

enter image description here

9

मैं इस है कि तुम क्या आवश्यकता है लगता है:

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

अनुमान:

  • संख्या के सेट में हमेशा से रहे हैं 1 या 2 अंक
  • पानी का छींटा टिप्पणी के साथ निम्नलिखित - और

नीचे है regex के दोनों मिलान हो जाएगा:

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

तो यह या तो डैश या हाइफ़न से मेल खाएगा? – Dziamid

+0

हाँ, क्या यह सही है? – Robbie

+0

इसके लिए +1, धन्यवाद – Dziamid

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

लगभग हर पुस्तक के लिए काम करता है ...

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

यह यहां प्रस्तुत सभी कोड का एक संकर है। केवल स्वरूपों यह उजागर नहीं करेंगे "पुस्तक का नाम केवल" या "पुस्तक & अध्याय केवल" (बस जोड़ें ": 1-सभी" अध्याय # के बाद) मैं भी कई रूप में अर्हता प्राप्त करने के लिए प्रदान अन्य कोड पाया , बाइबल कविता वाक्यविन्यास के अनुरूप नहीं है।

इन उदाहरणों मैं 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
23:34
यूहन्ना 14: 16-17,25-36
जॉन 14: 16-17; 32:25