2010-07-18 10 views
5

टाइपिंग (MySQL का उपयोग न करने के लिए) जब आप MySQL में LIKE फ़ंक्शन की तरह आंशिक स्ट्रिंग खोज सकते हैं लेकिन स्ट्रिंग को खोजते समय PHP का उपयोग कर सकते हैं, उदा।आंशिक तारों को खोजना PHP

<?php  

$string = "Stackoverflow"; 

$find = "overfl"; 

if($find == $string) 
{ 
    return true; 
} 
else 
{ 
    return false 
} 

?> 

लेकिन वह स्पष्ट रूप से नहीं होगा काम करेंगे, लेकिन वहाँ एक समारोह है जहाँ आप एक स्ट्रिंग के आंशिक रूप से खोज कर सकते हैं?

क्या होगा अगर यह एक सरणी में था: यह महान :)

संपादित हो सकता है?

यदि मैं स्ट्रॉप्स का उपयोग करता हूं, तो यह गूंज करता है, अगर मैं इसका उपयोग करता हूं, तो यह truetruetruetruetrue की तरह जाता है।

उत्तर

12

मैं strpos

$needle='appy'; 
$haystack='I\'m feeling flappy, and you?'; 

if(strpos($haystack,$needle)!==false){ 
    //then it was found 
    } 

उपयोग करने के लिए आप इसे, मामले की अनदेखी stripos उपयोग करना चाहते हैं करते हैं।

ध्यान दें कि इसके बारे में एक सूक्ष्मता यह है कि अगर सुई घाटी की शुरुआत में है, तो स्थिति 0 में, पूर्णांक 0 वापस कर दिया जाता है। इसका मतलब है कि आपको सख्त तुलना का उपयोग करके false की तुलना करनी चाहिए, या यह झूठी नकारात्मक उत्पन्न कर सकती है।

के मैनुअल में बताया गया है, इसके बाद के संस्करण

चेतावनी

इस समारोह बूलियन FALSE वापस आ सकते हैं जुड़ा हुआ है, लेकिन यह भी गलत करने के लिए एक गैर बूलियन मान जो मूल्यांकन करता है वापस आ सकते हैं के रूप में, इस तरह के रूप 0 या ""। जानकारी के लिए कृपया बूलियन पर अनुभाग पढ़ें। के लिए = 0= ऑपरेटर का उपयोग इस फ़ंक्शन के वापसी मूल्य का परीक्षण करें।

जहां तक ​​सरणी का उपयोग किया जाता है, स्ट्रॉप्स दो स्ट्रिंग लेने के लिए होता है। सरणी का उपयोग करने से Warning: strpos() expects parameter 1 to be string, array given या 1 चेतावनी उत्पन्न होगी: स्ट्रॉप्स(): सुई स्ट्रिंग या पूर्णांक नहीं है।

ठीक है, मान लें कि आपके पास तारों की एक सरणी है जिसके लिए खोज करना है।

आप कर सकते हैं

$needles=array('hose','fribb','pancake'); 
$haystack='Where are those pancakes??'; 

foreach($needles as $ndl){ 
    if(strpos($haystack,$ndl)!==false){ echo "'$ndl': found<br>\n"; } 
    else{ echo "'$ndl' : not found<br>\n"; } 
} 

एक स्ट्रिंग में एक से अधिक तार के लिए खोज, एक सरणी ... यह केवल आपको बतलाता है कि कम से कम एक मैच मिला था का उपयोग किए बिना का एक और तरीका।

$haystack='Where are those pancakes??'; 
$match=preg_match('#(hose|fribb|pancake)#',$haystack); 
//$match is now int(1) 

या, preg_match_all का उपयोग यह देखने के लिए करें कि कुल कितने मिलान हैं।

$all_matches=preg_match_all('#(hose|fribb|pancake)#',$haystack,$results); 
//all_matches is int(2). Note you also have $results, which stores which needles matched. 

उसमें, खोज शब्द एक नियमित अभिव्यक्ति है। () एक साथ शब्दों को समूहित करता है, और | का अर्थ है 'या'। # पैटर्न की शुरुआत और अंत को दर्शाता है। Regexes जल्दी जटिल हो सकता है, लेकिन निश्चित रूप से, वे काम करते हैं! उन्हें अक्सर प्रदर्शन कारणों से बचा जाता है, लेकिन यदि आप एकाधिक तारों का परीक्षण कर रहे हैं, तो यह ऊपर वर्णित सरणी लूपिंग विधि से अधिक कुशल हो सकता है। मुझे यकीन है कि ऐसा करने के अन्य तरीके भी हैं।

+0

ठीक है, अच्छा downvoted नहीं था। लेकिन क्या होगा यदि यह एक सरणी में था? (संपादित पोस्ट की जांच करें)। – MacMac

+0

क्या आपका मतलब है कि हैस्टैक एक सरणी है? या सुई? पीएचपी डॉक्स की जाँच करें - पहली टिप्पणी वर्तमान में 'strpos कि $ सुई के लिए एक सरणी स्वीकार करता है' है – JAL

+0

अनिवार्य रूप से आप सरणी पर पुनरावृति करने के लिए foreach का उपयोग करना होगा, जो भी एक बात है। अगर आप कई 'सुई' और एक 'भूसे के ढेर' है preg_match एक व्यवहार्य समाधान है। – JAL

3

strstr()/stristr() (बाद किया जा रहा है केस-संवेदी)

if(strstr($string,$find)!==false){ 
    //true 
} 
3

strpos() ऐसा कर सकते हैं।

if(strpos($string, $find) !== false) 
. . . 

ध्यान दें कि यह 0 वापस आ सकता है, इसलिए प्रकार-बराबर ऑपरेटर का उपयोग करें।

+1

अस्तित्व के लिए परीक्षण करते समय, झूठी ('! == झूठी') के खिलाफ सख्त तुलना का उपयोग किया जाना चाहिए। – BoltClock

+0

हां, जब आप डाउनवोट दे रहे थे तो मैंने संपादित किया। एक आदमी को कुछ सेकंड दें, ठीक है? –

+0

मुझे लगता है कि डाउनवॉटर ने आपके संपादन से पहले वोट डाला था। हालांकि यह जाहिरा तौर पर रद्द कर दिया गया है। नहीं, मैं एक है जो :) – BoltClock

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