2010-10-06 15 views
14
if (strpos(htmlentities($storage->getMessage($i)),'chocolate')) 

हाय, मैं ईमेल पते में विशिष्ट टेक्स्ट स्ट्रिंग खोजने के लिए जीमेल ओथ पहुंच का उपयोग कर रहा हूं। क्या ऊपर दिए गए कोड में स्ट्रॉप्स का उपयोग करने से टेक्स्ट इंस्टेंस को तेज़ी से और अधिक कुशलता से ढूंढने का कोई तरीका है? क्या मुझे हैश तकनीक का उपयोग करना चाहिए?php - पाठ के बड़े शरीर में एक स्ट्रिंग की खोज करने का सबसे तेज़ तरीका है?

+6

आपको ** ** स्ट्रॉप() 'फ़ंक्शन के साथ सख्त तुलना ऑपरेटर का उपयोग करना होगा। ऐसा इसलिए है क्योंकि यह एक पूर्णांक '0' वापस कर सकता है, जिसका अर्थ है स्ट्रिंग 'चॉकलेट' स्ट्रिंग की शुरुआत में पाया गया था। आपके पास बयान के साथ, यह 'गलत' का मूल्यांकन करेगा। सही होगा 'अगर (स्ट्रॉप्स (htmlentities ($ भंडारण-> getMessage ($ i)),' चॉकलेट ')!== गलत) ' – chigley

+2

आप 'htmlentities()' का उपयोग क्यों कर रहे हैं? यह सब कुछ धीमा कर देता है। – NullUserException

+0

क्योंकि मैं यह भी खोज रहा हूं कि यह HTML में है या नहीं - अगर मैं htmlentities टैग को छोड़ देता हूं तो क्या यह यूआरएल को ध्यान में रखेगा? उदाहरण के लिए –

उत्तर

26

PHP मैनुअल के अनुसार, हाँ- strpos() यह निर्धारित करने का सबसे तेज़ तरीका है कि एक स्ट्रिंग में कोई दूसरा है या नहीं।

नोट:

आप केवल निर्धारित करने के लिए चाहते हैं, तो एक विशेष सुई भूसे के ढेर के भीतर होती है, तेजी से और कम स्मृति गहन समारोह strpos() के बजाय का उपयोग करें।

इस बार उद्धृत किया गया है और फिर अन्य स्ट्रिंग तुलनाकारक के बारे में कोई php.net लेख में

(मैं strstr() से एक खींच लिया) हालांकि दो परिवर्तन है कि आपके कथन का बनाया जाना चाहिए नहीं है।

if (strpos($storage->getMessage($i),'chocolate') !== FALSE) 

इसका कारण यह है if(0) गलत का आकलन (और इसलिए नहीं चलता है), तथापि strpos() 0 लौटा सकते हैं या सुई बहुत शुरुआत में (स्थिति 0) भूसे के ढेर की है। साथ ही, htmlentities() को हटाकर आपका कोड बहुत तेज हो जाएगा। सभी htmlentities() कुछ वर्णों को उनके उचित HTML समकक्ष के साथ प्रतिस्थापित करता है। उदाहरण के लिए, यह बदल देता है हर &&

साथ आप कल्पना कर सकते हैं, जाँच एक स्ट्रिंग में हर चरित्र को व्यक्तिगत रूप से और उनमें से कई की जगह बेहद स्मृति और प्रोसेसर गहन है। इतना ही नहीं, लेकिन अगर आप टेक्स्ट तुलना करने की योजना बना रहे हैं तो यह अनावश्यक है। उदाहरण के लिए, की तुलना में निम्नलिखित कथनों:

strpos('Billy & Sally', '&'); // 6 
strpos('Billy & Sally', '&'); // 6 
strpos('Billy & Sally', 'S'); // 8 
strpos('Billy & Sally', 'S') // 12 

या, एक और भी अधिक चरम मामले में, आप भी गलत पर मूल्यांकन करने के लिए कुछ सच हो सकती है।

strpos('<img src...', '<'); // 0 
strpos('&lt;img src...','<'); // FALSE 

इसे रोकने के लिए आप और भी अधिक HTML इकाइयों का उपयोग कर समाप्त हो जाएंगे।

strpos('&lt;img src...', '&lt;'); // 0 

लेकिन जैसा कि आप कल्पना कर सकते हैं, यह केवल कोड के लिए परेशान नहीं है बल्कि अनावश्यक हो जाता है। आप पूरी तरह से HTML इकाइयों को छोड़कर बेहतर हैं। आमतौर पर एचटीएमएल इकाइयों का उपयोग तब किया जाता है जब आप टेक्स्ट आउटपुट कर रहे हों। तुलना नहीं कर रहा है।

2

strpospreg_match और इस मामले में विकल्प की तुलना में तेजी रहने की संभावना है, सबसे अच्छा विचार वास्तविक उदाहरण डेटा के साथ अपने स्वयं के कुछ मानक करते हैं और देखते हैं कि क्या आपकी आवश्यकताओं के लिए सबसे अच्छा है, हालांकि उस के लिए होगा यह अधिक हो सकता है। जब तक यह एक समस्या बनने लगती है तब तक प्रदर्शन के बारे में बहुत चिंता न करें

+0

दोनों मिलते हैं, यह पहले से ही किसी समस्या का है। मैं इस स्ट्रिंग के लिए जल्दी से खोज करने की कोशिश कर रहा हूं उपयोगकर्ता का ईमेल इनबॉक्स है, और एक ईमेल के माध्यम से सॉर्ट करने में लगभग 2 सेकंड लगते हैं। मैं इस नंबर को कम से कम एक सेकंड तक प्राप्त करना चाहता हूं। –

+0

क्या आप सुनिश्चित हैं कि बाधा स्ट्रॉप्स में है, या इनबॉक्स खोज के साथ? यदि आप आईमैप का उपयोग कर रहे हैं तो मुझे बताएं कि मैं आगे की मदद कर सकता हूं। – neopickaze

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

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