php - REGEX: get all words in string that is not within a block quote -


कृपया इसे देखें:

  $ content = 'हैलो मैं टॉम हूँ और मैं & lt; ब्लॉकक्ॉट क्लास = "उद्धृत पाठ" & gt; एक उद्धरण के अंदर दूसरे टॉम & lt; / blockquote & gt;'; $ पैटर्न = '# टॉम #'; $ Matches = array (); Preg_match_all ($ पैटर्न, $ सामग्री, $ मैचों); var_dump ($ से मेल खाता है);  

यह दोनों टॉम स्ट्रिंग देता है लेकिन मुझे केवल टॉम स्ट्रिंग्स चाहिए जो ब्लॉक कोट टैग्स के अंदर नहीं हैं I इस मामले में केवल एक टॉम स्ट्रिंग लौटा जाना चाहिए। यह कैसे करें?

यह regex आपके लिए काम करना चाहिए:

  & Lt; ब्लॉकक्ोट [^ & gt;] * & gt; [^ & lt;] * & lt; / blockquote & gt; (* SKIP) (?!) | टॉम  

डेमो: < नमस्ते, मैं टॉम हूँ और मैं & lt; ब्लॉकक्ॉट वर्ग = "उद्धृत पाठ" & gt; एक उद्धरण के अंदर दूसरे टॉम & lt; / blockquote & gt; '; & lt;; & lt;; & lt; $ Regex = "~ & LT; ब्लॉककोट [^ & gt;] * & gt; [^ & LT;] * & lt; / ब्लॉककोट & gt; (* छोड़ें) (?!) | टॉम ~"; $ Count = preg_match_all ($ regex, $ स्ट्रिंग, $ m); प्रतिबन्ध $ count। "& Lt; br / & gt;"; print_r ($ मी [0]); ? & Gt;

आउटपुट:

  1 // का अर्थ है कि केवल एक ही मैच अरा ([0] = & gt; टॉम) <   

स्पष्टीकरण

  1. एकांतर के बाईं ओर, हम एक पूरे ब्लॉककोट से मेल खाते हैं, जो हम जानते हैं कि हम नहीं चाहते। (?!) रीगएक्स को विफल करने के लिए मजबूर करता है और जब टॉम ब्लॉककोट के अंदर मिलान करता है (* SKIP) को इंजन बैक्राक करता है जो पूरे मैच को अब तक छोड़ने और स्ट्रिंग में अगली स्थिति में एक नया मैच का प्रयास करने के लिए कहता है।
  2. दाईं ओर प्रक्षेपण, हम अब सुरक्षित रूप से टॉम से मेल कर सकते हैं।

ब्लॉक करने वाले अवरोधों में "टॉम" वाले ब्लॉक को छोड़ने के बजाय हमजा के लिए धन्यवाद, हम किसी ब्लॉककोट ब्लॉक को छोड़ सकते हैं।


Comments

Popular posts from this blog

import - Python ImportError: No module named wmi -

Editing Python Class in Shell and SQLAlchemy -

c# - MySQL Parameterized Select Query joining tables issue -