2011-03-01 11 views
8

पीओ बॉक्स को सत्यापित करना चाहते हैं लेकिन यह जानना चाहता था कि ऐसी सत्यापन मौजूद है या नहीं। मैं में पता फ़ील्ड विभाजित है पता 1 और पता 2 (जहां इस तरह के पीओ, अपार्टमेंट, सूट की जानकारी हासिल की)पीओ बॉक्स सत्यापन

उदाहरण:

Address 1: 123 Main Street 
Address 2: Suite 100 
City: Any Town  
State: Any State 
Zip: Any Zip 

पीओ बॉक्स (कर सकते हैं बॉक्स के लिए भी उप बिन) उदाहरण:

  • पीओ बॉक्स 123
  • पीओ बॉक्स 123
  • पीओ 123
  • पोस्ट ऑफ़िस बॉक्स 123
  • पीओ 123
  • बॉक्स 123
  • POB 123
  • P.O.B 123
  • लेटर बक्स 123
  • पोस्ट 123
  • पोस्ट बॉक्स 123

(मैं जानता हूँ कि शायद और अधिक मैं के लिए मान्य करने के लिए की जरूरत है देखते हैं, लेकिन यह है कि मैं क्या, के बारे में सोच या जोड़ने के लिए नि: शुल्क सही महसूस कर सकता था है)

मैं जानता हूँ कि एक रेगुलर एक्सप्रेशन से इस बात के लिए सबसे अच्छा होगा और मुझे लगता है अन्य, #2

ढेर #1 पर सवाल अन्य सवाल से Regex का उपयोग करके देखा है मैं अच्छा परिणाम प्राप्त लेकिन यह कुछ याद करते हैं मुझे लगता है कि यह

पकड़ने चाहिए
$arr = array (
    'PO Box 123', 
    'P.O. Box 123', 
    'PO 123', 
    'Post Office Box 123', 
    'P.O 123', 
    'Box 123', 
    '#123',   // no match 
    '123',   // no match 
    'POB 123', 
    'P.O.B 123', // no match 
    'P.O.B. 123', // no match 
    'Post 123',  // no match 
    'Post Box 123' // no match 
); 

foreach($arr as $po) { 
    if(preg_match("/^\s*((P(OST)?.?\s*O(FF(ICE)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i", $po)) { 
     echo "A match was found: $po\n"; 
    } else { 
     echo "A match was not found: |$po| \n"; 
    } 
} 

यह सरणी में पिछले दो मानों को क्यों नहीं पकड़ रहा है?

+0

+1 अच्छा शोध करने के लिए +1। – srijan

+0

एक जेएस प्रश्न के लिए लेकिन अभी भी एक उत्कृष्ट उत्तर: https://stackoverflow.com/questions/5680050/po-box-regular-expression- अवैधता – turibe

उत्तर

9

अब आपके रेगेक्स के साथ, 'ऑफिस' में 'ओ' की आवश्यकता है। इसके बजाय ^\s*((P(OST)?.?\s*(O(FF(ICE)?))?.?\s+(B(IN|OX))?)|B(IN|OX)) आज़माएं (एक सशर्त मैच में 'ओ' को समूहीकृत करें)।

संपादित करें: यह /^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))/i होना चाहिए। बीटीडब्ल्यू, http://rubular.com/ एक बहुत अच्छा नियमित अभिव्यक्ति परीक्षण इंजन है। हमेशा की तरह, नए उपकरणों के बारे में पता करने के लिए अच्छा :)

+0

हम्म ने यह मिलान तोड़ दिया: पीओ। बॉक्स 123 –

+0

यह नोट करने के लिए धन्यवाद कि @ फिल-पैफोर्ड, मेरे जवाब में सुधार हुआ। मेरा परीक्षण करते समय आकस्मिक रूप से आपके मूल रेगेक्स में प्रश्न चिह्नों में से एक को हटा दिया गया। – William

+0

धन्यवाद कि यह –

2

के माध्यम से इसे जाने दो ...

/   # Beginning of the regex 
^   # Beginning of the string 
\s*  # (Any whitespace) 
((
    P  # Matches your P 
    (OST)? # Matches your ost 
    .?  # Matches the space 
    \s*  # (Any whitespace) 
    O  # Expects an O - you don't have one. Regex failed. 
2

यह एक बेहतर काम करता है के रूप में यह मैच सेट में अनावश्यक समूहों दूर करता है और सिर्फ पूरे मैच देता है।

स्किप हैं पोस्ट 123:

/^\s*((?:P(?:OST)?.?\s*(?:O(?:FF(?:ICE)?)?)?.?\s*(?:B(?:IN|OX)?)+)+|(?:B(?:IN|OX)+\s+)+)\s*\d+/i 

पोस्ट 123 छोड़ें नहीं करता:

/^\s*((?:P(?:OST)?.?\s*(?:O(?:FF(?:ICE)?)?)?.?\s*(?:B(?:IN|OX)?)?)+|(?:B(?:IN|OX)+\s+)+)\s*\d+/i 

अंत में निकालें \ d + संख्या आवश्यकता को छोड़ने के लिए। प्रश्न पूछने से पहले

संबंधित मुद्दे