परिचय: वह सवाल जो हर PHP डेवलपर को परेशान करता है
\n\nएक स्थिति की कल्पना करें: आप PHP में कोड लिख रहे हैं, और आपको जाँचना है कि क्या किसी स्ट्रिंग में कोई खास शब्द मौजूद है। लगता है बहुत आसान है, है ना? लेकिन जब आप Stack Overflow पर जाते हैं, तो पाते हैं कि इस सवाल को हज़ारों बार देखा जा चुका है और इसके दर्जनों जवाब हैं। लोग strpos में उलझ जाते हैं, preg_match का उपयोग करते हैं जब एक साधारण फंक्शन काफी होता है, और केस सेंसिटिविटी और एन्कोडिंग के जाल में फंस जाते हैं। आज हम सिर्फ एक तैयार जवाब नहीं देंगे — हम PHP के अंदर झाँकेंगे और समझेंगे कि ये फंक्शन वास्तव में कैसे काम करते हैं। तैयार हैं? चलिए शुरू करते हैं!
क्लासिक तरीका: strpos और इसके छिपे खतरे
\n\nStack Overflow पर सबसे लोकप्रिय जवाब strpos का उपयोग करना है। यह PHP का एक बिल्ट-इन फंक्शन है जो सबस्ट्रिंग की पहली उपस्थिति की स्थिति (पोजीशन) ढूंढता है। लेकिन एक समस्या है: शुरुआती लोग अक्सर ऐसा कोड लिखते हैं:
$string = "नमस्ते, दुनिया!";\n$word = "दुनिया";\nif (strpos($string, $word)) {\n echo "शब्द मिल गया!";\n} else {\n echo "शब्द नहीं मिला!";\n}\n\n\nऔर यह तब तक काम करता है... जब तक शब्द स्ट्रिंग की शुरुआत में न हो। क्यों? क्योंकि strpos एक पोजीशन (संख्या) लौटाता है, और अगर शब्द पोजीशन 0 पर है, तो PHP में 0 को if कंडीशन में false मान लिया जाता है। सही तरीका यह है:
if (strpos($string, $word) !== false) {\n echo "शब्द मिल गया!";\n}\n\n\nstrpos अंदर से कैसे काम करता है?
\n\nजब आप strpos को कॉल करते हैं, PHP आंतरिक रूप से एक सबस्ट्रिंग सर्च एल्गोरिदम का उपयोग करता है। PHP के आधुनिक वर्जन (7.x और 8.x) में, एक ऑप्टिमाइज़्ड एल्गोरिदम लागू किया गया है जो बॉयर-मूर-हॉर्सपूल एल्गोरिदम पर आधारित है। यह सिर्फ एक-एक करके कैरेक्टर नहीं जांचता, बल्कि "बैड कैरेक्टर" टेबल का उपयोग करके टेक्स्ट के पूरे ब्लॉक को छोड़ देता है यदि खोजे जा रहे शब्द का कोई कैरेक्टर मेल नहीं खाता। यह सर्च को बहुत तेज़ बनाता है, खासकर लंबी स्ट्रिंग्स के लिए।
लेकिन एक सीमा है: strpos केस-सेंसिटिव है। "दुनिया" और "दुनिया" (अलग केस में) उसके लिए अलग शब्द हैं। अगर आपको केस-इनसेंसिटिव जाँच चाहिए, तो stripos का उपयोग करें — यह इसका विकल्प है जो केस को इग्नोर करता है।
आधुनिक तरीका: str_contains (PHP 8.0+)
\n\nPHP 8.0 से शुरू होकर, एक लंबे समय से प्रतीक्षित फंक्शन str_contains आया। यह strpos की समस्या को हमेशा के लिए हल करता है। पोजीशन चेक करने के बजाय, यह सीधे true या false लौटाता है:
$string = "नमस्ते, दुनिया!";\n$word = "दुनिया";\nif (str_contains($string, $word)) {\n echo "शब्द मिल गया!";\n}\n\n\nstr_contains के अंदर क्या है?
\n\nअंदर से, str_contains strpos पर एक रैपर है। यह उसी आंतरिक सर्च फंक्शन को कॉल करता है, लेकिन परिणाम को स्वचालित रूप से बूलियन वैल्यू में बदल देता है। यह कोड को साफ और सुरक्षित बनाता है। हालांकि, अगर आप PHP के पुराने वर्जन (7.4 और उससे नीचे) पर काम कर रहे हैं, तो str_contains उपलब्ध नहीं है — आपको strpos को !== false चेक के साथ उपयोग करना होगा।
शक्तिशाली उपकरण: preg_match के साथ रेगुलर एक्सप्रेशन
\n\nकभी-कभी सिर्फ एक शब्द की उपस्थिति नहीं, बल्कि शब्दों का एक पूरा समूह या पैटर्न चेक करना होता है। यहाँ पर preg_match काम आता है। रेगुलर एक्सप्रेशन आपको सुपरपावर देते हैं: आप पूरे शब्दों को खोज सकते हैं (ताकि "दुनिया" "दुनियादारी" से मेल न खाए), केस को इग्नोर कर सकते हैं, शब्द सीमाओं पर सर्च कर सकते हैं, और भी बहुत कुछ।
$string = "नमस्ते, दुनियादारी!";\n$word = "दुनिया";\nif (preg_match("/\\b" . preg_quote($word, '/') . "\\b/ui", $string)) {\n echo "शब्द मिल गया!";\n} else {\n echo "शब्द नहीं मिला!";\n}\n\n\nयहाँ \\b शब्द सीमा (word boundary) को दर्शाता है, और फ्लैग u यूनिकोड सपोर्ट को सक्षम करता है (ताकि हिंदी अक्षर सही से काम करें)। फ्लैग i सर्च को केस-इनसेंसिटिव बनाता है। फंक्शन preg_quote स्पेशल कैरेक्टर्स को एस्केप करता है, अगर