दिलचस्प पोस्ट
प्रॉपर्टी नाम पर अंडरस्कोर उपसर्ग? सीएसएस विशिष्टता कैसे काम करती है? क्रॉस-साइट AJAX अनुरोध समानांतर प्रवाह, कलेक्टर और धागा सुरक्षा गतिशील रूप से डेटा फ्रेम का चयन करें $ और स्तंभ नामों का एक वेक्टर फ्लैटमैप / मानचित्र परिवर्तन के लिए समझने के साथ भ्रमित अगर सबसे ज्यादा किया जाता है तो एफ़-एलिफ-एलीफ-एफ़ ऐ कथन बनाने का सबसे कारगर तरीका है? पायथन के बिना प्रक्रिया आउटपुट पढ़ना बंद करें? नेविगेशन नियंत्रक में वापस बटन के लिए कार्रवाई सेट करना यह कैसे "सरणी का आकार" टेम्पलेट फ़ंक्शन कार्य करता है? UIButton छवि + पाठ IOS Android में कैमरा ओरिएंटेशन समस्या हम इनपुट को पढ़ने के बाद cin.clear () और cin.ignore () क्यों कॉल करेंगे? UITextField के लिए केवल अल्फ़ान्यूमेरिक वर्णों की अनुमति दें GitHub में दूरस्थ परिवर्तन कैसे मर्ज करें?

PHP में नियमित अभिव्यक्ति शब्द सीमाएं कैसे काम करती हैं?

मैं वर्तमान में सामग्री में विशिष्ट शब्द मिलान करने के लिए एक लाइब्रेरी लिख रहा हूं

मूल रूप से जिस तरह से यह काम करता है वह नियमित अभिव्यक्तियों में शब्दों को संकलित करके और नियमित अभिव्यक्तियों के माध्यम से सामग्री को चलाना है।

मुझे जो फीचर जोड़ना है, वह निर्दिष्ट कर रहा है कि क्या किसी शब्द को मैच शुरू करना और / या समाप्त करना चाहिए। उदाहरण के लिए, मेरे पास cat का शब्द है मैं निर्दिष्ट करता हूं कि उसे एक शब्द शुरू करना होगा , इसलिए cat रूप में मैच शुरू हो जाएगा , क्योंकि cat शुरू में है, लेकिन ducat मैच नहीं होगा क्योंकि cat शब्द को शुरू नहीं करती है

मैं यह शब्द सीमाओं का उपयोग करना चाहता था, लेकिन कुछ परीक्षण के दौरान मुझे पता चला कि यह काम नहीं करता जैसा मैं उम्मीद करता हूं।

निम्नलिखित लो,

 preg_match("/(^|\b)@nimal/i", "something@nimal", $match); preg_match("/(^|\b)@nimal/i", "something!@nimal", $match); 

उपरोक्त बयानों में मैं निम्नलिखित परिणामों की अपेक्षा करता हूं,

 > false > 1 (@nimal) 

लेकिन परिणाम इसके विपरीत है,

 > 1 (@nimal) > false 

पहले में, मैं उम्मीद करता हूं कि यह असफल हो जायेगा क्योंकि समूह @ खाएगा, जिससे nimal को @ nimal के खिलाफ मैच @nimal , जो स्पष्ट रूप से नहीं है। इसके बजाय, समूह एक खाली स्ट्रिंग से मेल खाता है, इसलिए @nimal मेल खाता है, जिसका अर्थ है कि शब्द को शब्द का हिस्सा माना जाता है।

दूसरे में, मैं उम्मीद करता हूं कि समूह को खाने के लिए ! बाकी को मैच करने के लिए @nimal को छोड़कर (जो इसे करना चाहिए)। इसके बजाय, यह गठबंधन प्रतीत होता है ! और @ एक शब्द बनाने के लिए, जो निम्न मिलान द्वारा पुष्टि की गई है,

 preg_match("/g\b!@\bn/i", "something!@nimal", $match); 

कोई विचार क्यों नियमित अभिव्यक्ति यह करता है?

मुझे सिर्फ एक पृष्ठ पसंद है जो स्पष्ट रूप से स्पष्ट करता है कि शब्द की सीमाओं को कैसे निर्धारित किया जाता है, मुझे सिर्फ मेरे जीवन के लिए नहीं मिल सकता है

वेब के समाधान से एकत्रित समाधान "PHP में नियमित अभिव्यक्ति शब्द सीमाएं कैसे काम करती हैं?"

शब्द सीमा \b एक शब्द \w (एक शब्द चरित्र) से एक \W एक शब्द वर्ण चरित्र से बदलते हैं। यदि आपके @ से पहले एक \b है तो आप मैच करना चाहते हैं जो कि \W अक्षर है तो मैच करने के लिए आपको अपने @

 something@nimal ^^ 

==> g और @ बीच शब्द सीमा के कारण मिलान करें

 something!@nimal ^^ 

==> के बीच में कोई मैच नहीं है ! और @ कोई शब्द सीमा नहीं है, दोनों अक्षर हैं \W

एक समान समस्या का मुझे सामना करना पड़ रहा है, ऐसा शब्द can't और it's can't , जहां एपोडोफ़ी शब्द को शब्द / गैर-शब्द सीमा माना जाता है (जैसा कि यह \W और नहीं \w से मेल खाता है)। यदि यह आपके लिए एक समस्या होने की संभावना है, तो आपको एपॉस्ट्रॉफी (और सभी प्रकार जैसे वे 'और' जो कभी-कभी दिखाई देते हैं) को बाहर करना चाहिए, उदाहरण के लिए एक वर्ग जैसे [\b^'] बनाकर

आपको UTF8 वर्णों के साथ समस्याओं का अनुभव भी हो सकता है जो कि वास्तव में शब्द का एक हिस्सा हैं (उदाहरण के लिए, किसी शब्द द्वारा हमारे मनुष्य का क्या मतलब है), उदाहरण के लिए, अपने regex का परीक्षण करें कि आप एक शब्द जैसे Svašek

यह इसलिए अक्सर "भाषाई" सीमाओं जैसे कि अंतरिक्ष वर्ण (केवल शाब्दिक रूप से रिक्त स्थान नहीं, बल्कि नए वर्गों और टैब सहित पूर्ण वर्ग), अल्पविराम, कोलन, पूर्ण-स्टॉप, आदि के लिए सामान्य "भाषाई" पाठ को पार्स करने में आसान होता है (और कोण-कोष्ठक यदि आप HTML को पार्स कर रहे हैं)। YMMV।

@ शब्द वर्ण का हिस्सा नहीं है (संभवतः आपके लोकेल में, हालांकि, डिफ़ॉल्ट रूप से , "शब्द" का किरदार कोई भी अक्षर या अंक या अंडरस्कोर चरित्र है , सोर्स – तो @ word वर्ण नहीं है, इसलिए नहीं \w लेकिन \W और किसी भी \w\W या \W\w संयोजन से लिंक के रूप में एक \b स्थिति चिह्नित करता है), इसलिए यह हमेशा शब्द सीमा है जो ओ.पी. के रीजेक्स में (मैच) है।

निम्नलिखित आपके regexes के समान है, जो कि @ बजाय, उपयोग किया जाता है। और लाइन की शुरुआत एक शब्द सीमा भी है, इसलिए इसे भी निर्दिष्ट करने की आवश्यकता नहीं है:

 $r = preg_match("/\b(animal)/i", "somethinganimal", $match); var_dump($r, $match); $r = preg_match("/\b(animal)/i", "something!animal", $match); var_dump($r, $match); 

आउटपुट:

 int(0) array(0) { } int(1) array(2) { [0]=> string(6) "animal" [1]=> string(6) "animal" }