अगर एक स्ट्रिंग में एक विशिष्ट शब्द है, तो मैं कैसे जांच सकता हूं?


2661

विचार करें:

$a = 'How are you?';

if ($a contains 'are')
    echo 'true';

मान लीजिए मेरे पास ऊपर का कोड है, कथन लिखने का सही तरीका क्या है if ($a contains 'are')?

जवाबों:


6888

आप उस strpos()फ़ंक्शन का उपयोग कर सकते हैं जिसका उपयोग किसी दूसरे के अंदर एक स्ट्रिंग की घटना को खोजने के लिए किया जाता है:

$a = 'How are you?';

if (strpos($a, 'are') !== false) {
    echo 'true';
}

ध्यान दें कि के उपयोग !== falseजानबूझकर है (न तो != falseहै और न ही === trueवांछित परिणाम वापस आ जाएगी); strpos()या तो ऑफसेट जिस पर सुई स्ट्रिंग हैस्टैक स्ट्रिंग में शुरू होती है, या falseयदि सुई नहीं मिली है तो बूलियन । चूंकि 0 एक वैध ऑफसेट है और 0 "फॉल्सी" है, इसलिए हम सरल निर्माणों का उपयोग नहीं कर सकते हैं !strpos($a, 'are')


261
पार्टी के लिए बहुत देर हो चुकी है, लेकिन इससे सावधान रहें। यह स्ट्रिंग के लिए भी सही होगा 'क्या आप परवाह करते हैं?'
0

167
@ सबसे अच्छी तरह से हाँ बेशक यह सच हो जाएगा क्योंकि स्ट्रिंग में 'हैं'। यदि आप शब्द के लिए विशेष रूप से देख रहे हैं, तो आपको अधिक चेक करने की आवश्यकता होगी, उदाहरण के लिए, यह जांचें कि क्या ए और ई के बाद एक चरित्र या एक जगह है
jsherk

40
ऊपर बहुत अच्छी टिप्पणियाँ! मैं कभी उपयोग नहीं करता! = (या ==, सब के बाद! == और === सबसे अच्छा विकल्प है (मेरी राय में) सभी पहलुओं पर विचार (गति, सटीकता आदि)।
मेलसी

10
@jsherk रेगेक्स क्यों नहीं, फिर? कुछ "जैसे" हैं।
गिउलिओ मस्केलरलो

21
मैं हमेशा strpos($a, 'are') > -1सच का परीक्षण करने के लिए उपयोग करके इस मुद्दे से बचता हूं । डिबगिंग के नजरिए से, मुझे लगता है कि मेरे दिमाग में कम से कम घड़ी चक्रों का निर्धारण होता है जो यह निर्धारित करते हैं कि लाइन को सही तरीके से लिखा गया है जब मुझे सन्निहित बराबर संकेतों की गणना नहीं करनी है।
शाम

607

आप नियमित अभिव्यक्तियों का उपयोग कर सकते हैं, यह शब्द मिलान के लिए बेहतर है strposक्योंकि अन्य उपयोगकर्ताओं द्वारा उल्लेख किया गया है, यह भी इस तरह के किराया, देखभाल, घूरना, आदि के लिए सही लौटेगा। यह केवल शब्द सीमाओं का उपयोग करके नियमित अभिव्यक्ति से बचा जा सकता है।

इसके लिए एक साधारण मैच कुछ इस तरह दिख सकता है:

$a = 'How are you?';

if (preg_match('/\bare\b/', $a)) {
    echo 'true';
}

प्रदर्शन के पक्ष में, strposलगभग तीन गुना तेज है और मन में है, जब मैंने एक बार में एक मिलियन की तुलना की, तो इसे preg_matchखत्म होने में 1.5 सेकंड लगे और इसके लिए strpos0.5 सेकंड लगे।

संपादित करें: स्ट्रिंग के किसी भी भाग को खोजने के लिए, केवल शब्द से शब्द नहीं, मैं एक नियमित अभिव्यक्ति का उपयोग करने की सलाह दूंगा

$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {
    echo 'true';
}

iनियमित अभिव्यक्ति के अंत में नियमित अभिव्यक्ति में परिवर्तन केस-संवेदी होने के लिए, अगर आपको लगता है कि नहीं करना चाहते, आप इसे बाहर छोड़ सकते हैं।

अब, यह कुछ मामलों में काफी समस्याग्रस्त हो सकता है क्योंकि $ सर्च स्ट्रिंग को किसी भी तरह से सैनिटाइज़ नहीं किया जाता है, मेरा मतलब है कि यह कुछ मामलों में चेक को पास नहीं कर सकता है जैसे कि $searchएक उपयोगकर्ता इनपुट है जो वे कुछ स्ट्रिंग जोड़ सकते हैं जो व्यवहार कर सकते हैं जैसे कुछ अलग नियमित अभिव्यक्ति ...

इसके अलावा, यहाँ विभिन्न रेगुलर एक्सप्रेशन्स Regex101 के स्पष्टीकरण और परीक्षण को देखने के लिए एक बढ़िया उपकरण है

कार्यक्षमता के दोनों सेटों को एक बहु-बहुद्देश्यीय फ़ंक्शन (चुनिंदा केस संवेदनशीलता के साथ) में संयोजित करने के लिए, आप इस तरह से कुछ का उपयोग कर सकते हैं:

function FindString($needle,$haystack,$i,$word)
{   // $i should be "" or "i" for case insensitive
    if (strtoupper($word)=="W")
    {   // if $word is "W" then word search instead of string in string search.
        if (preg_match("/\b{$needle}\b/{$i}", $haystack)) 
        {
            return true;
        }
    }
    else
    {
        if(preg_match("/{$needle}/{$i}", $haystack)) 
        {
            return true;
        }
    }
    return false;
    // Put quotes around true and false above to return them as strings instead of as bools/ints.
}

9
@ अलेक्जेंडर। प्लुतोव आप में से दूसरा है जो आप मुझे -1 दे रहे हैं और सवाल नहीं? cmon यह उत्तर google.com पर
Breezer

64
+1 सरल स्ट्रिंग की खोज करने का यह एक भयानक तरीका है, लेकिन SO के कई आगंतुक अपने स्वयं के किसी भी सबस्ट्रिंग को खोजने के लिए किसी भी तरीके की तलाश कर रहे हैं, और यह सहायक है कि सुझाव को लाया गया है। यहां तक ​​कि ओपी की देखरेख हो सकती है - उसे उसके विकल्प के बारे में बताएं।
सैमगूडी

72
तकनीकी रूप से, यह सवाल पूछता है कि शब्दों को विकल्प के रूप में कैसे खोजें । यह वास्तव में मेरी मदद करता है क्योंकि मैं इसे रेगेक्स शब्द सीमाओं के साथ उपयोग कर सकता हूं। विकल्प हमेशा उपयोगी होते हैं।

15
+1 के उत्तर के लिए और -1 से @ plutov.by टिप्पणी के लिए क्योंकि, स्ट्रैप बस एक एकल चेक है बीच में आप एक ही समय में कई शब्दों की जांच कर सकते हैं पूर्व: preg_match (/ are | you / not /)
albanx

4
रेगुलर एक्सप्रेशन अंतिम उपाय विधि होनी चाहिए। तुच्छ कार्यों में उनका उपयोग हतोत्साहित किया जाना चाहिए। मैं बुरा कोड खुदाई के कई वर्षों की ऊंचाई से इस पर जोर देता हूं।
yentsun

256

यहाँ थोड़ा उपयोगिता फ़ंक्शन है जो इस तरह की स्थितियों में उपयोगी है

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}

74
@RobinvanBaalen वास्तव में, यह कोड की पठनीयता में सुधार कर सकता है। इसके अलावा, डाउनवोट्स के लिए माना जाता है कि वे (बहुत) बुरे जवाब देते हैं, "तटस्थ" लोगों के लिए नहीं।
Xaqq

37
@RobinvanBaalen पठनीयता के लिए परिभाषा के अनुसार लगभग (पठनीयता के विचार को संप्रेषित करने के लिए कि आप क्या कर रहे हैं)। तुलना करें जो अधिक पठनीय है: if ($email->contains("@") && $email->endsWith(".com)) { ...याif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
ब्रैंडन जूल

3
अंत नियमों में @RobinvanBaalen को तोड़ने का मतलब है। अन्यथा लोग चीजों को करने के नए आविष्कारशील तरीकों के साथ नहीं आते हैं :)। इसके अलावा मुझे स्वीकार करना पड़ता है कि मुझे मार्टिनफॉवलर डॉट कॉम पर सामान के चारों ओर मन को लपेटने में परेशानी है। लगता है कि सही बात यह है कि चीजों को खुद से आज़माएं और पता करें कि दृष्टिकोण सबसे सुविधाजनक क्या है।
जेम्स पी।

5
एक अन्य राय: एक उपयोगिता फ़ंक्शन के साथ जिसे आप आसानी से लपेट सकते हैं डिबगिंग में मदद कर सकते हैं। इसके अलावा यह अच्छे ऑप्टिमाइज़र के लिए रोना रोता है जो उत्पादन सेवाओं में इस तरह के ओवरहेड को खत्म करते हैं। अतः सभी मतों के मान्य बिंदु हैं। ;)
टिनो

18
बेशक यह उपयोगी है। आपको इसे प्रोत्साहित करना चाहिए। क्या होता है अगर PHP 100 में स्ट्रिंग स्थानों को खोजने का एक नया और तेज़ तरीका है? क्या आप अपने सभी स्थानों को बदलना चाहते हैं जहाँ आप स्ट्रैप कहते हैं? या आप केवल फ़ंक्शन के भीतर समाहित परिवर्तन करना चाहते हैं ??
कॉसमिन

143

इन उत्तरों से ज्यादातर आपको बता देंगे, वहीं अगर आपके स्ट्रिंग, आम तौर पर नहीं है कि में एक सबस्ट्रिंग प्रकट होता है क्या आप चाहते हैं कि आप किसी विशेष के लिए देख रहे हैं शब्द , और नहीं एक स्ट्रिंग

क्या फर्क पड़ता है? सबस्ट्रिंग अन्य शब्दों में प्रकट हो सकते हैं:

  • "क्षेत्र" की शुरुआत में "हैं"
  • "हरे" के अंत में "हैं"
  • "किराए" के बीच में "हैं"

इसे कम करने का एक तरीका यह होगा कि एक नियमित अभिव्यक्ति का उपयोग शब्द सीमाओं ( \b) के साथ जोड़ा जाए :

function containsWord($str, $word)
{
    return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}

इस विधि में ऊपर उल्लिखित समान झूठी सकारात्मकता नहीं है, लेकिन इसके अपने कुछ किनारे मामले हैं। शब्द सीमाओं गैर शब्द अक्षर (पर से मेल खाते हैं \W) है, जो कुछ भी है कि नहीं होने जा रहे हैं a-z, A-Z, 0-9, या _। इसका अर्थ है कि अंक और अंडरस्कोर शब्द वर्णों के रूप में गिने जा रहे हैं और इस तरह के परिदृश्य विफल हो जाएंगे:

  • "क्या आप" सोच रहे हैं?
  • "हैं" में "lol u dunno wut वो हैं?"

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


24
यह विहित उत्तर होना चाहिए। क्योंकि हम शब्दों की तलाश कर रहे हैं और सब्सट्रिंग्स नहीं , रेगेक्स उपयुक्त है। मैं उन \bदो चीजों को \Wभी ^$
मिलाऊंगा

यह सही उत्तर होना चाहिए .. बाकी के जवाब "स्ट्रिंग" में "डू यू केयर" जैसे मिलेंगे .. जैसा कि @ डस्ट द्वारा बताया गया है
रॉबर्ट सिंक्लेयर

@RobertSinclair क्या इतना बुरा है? यदि आप मुझसे पूछते हैं कि क्या स्ट्रिंग "क्या आप परवाह करते हैं" में "शब्द शामिल हैं" हैं तो मैं "हां" कहूंगा। शब्द "हैं" स्पष्ट रूप से उस स्ट्रिंग का एक विकल्प है। यह एक अलग प्रश्न है "" "" है "" स्ट्रिंग में शब्दों में से एक है "क्या आप" "" "परवाह करते हैं"।
पॉल

@Paulpro Eventhough ओपी ने $ निर्दिष्ट नहीं किया है एक वाक्यांश है, मुझे पूरा यकीन है कि यह निहित था। तो उनका सवाल था कि वाक्यांश के अंदर शब्द का पता कैसे लगाया जाए। नहीं अगर एक शब्द के अंदर एक शब्द शामिल है, जो मुझे लगता है कि अधिक से अधिक बार अप्रासंगिक होगा।
रॉबर्ट सिनक्लेयर


125

यह निर्धारित करने के लिए कि क्या एक स्ट्रिंग में एक और स्ट्रिंग है आप PHP फ़ंक्शन स्ट्रैप () का उपयोग कर सकते हैं ।

int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )

<?php

$haystack = 'how are you';
$needle = 'are';

if (strpos($haystack,$needle) !== false) {
    echo "$haystack contains $needle";
}

?>

सावधान:

यदि आप जिस सुई की खोज कर रहे हैं, वह हैस्टैक की शुरुआत में है, तो यह स्थिति 0 पर लौटेगी, यदि आप एक ==तुलना करते हैं जो काम नहीं करेगा , तो आपको एक करने की आवश्यकता होगी===

एक ==चिन्ह एक तुलना और परीक्षण है कि क्या चर / अभिव्यक्ति / बायीं ओर का मान वैसा ही है जैसा चर / अभिव्यक्ति / दायीं ओर होता है।

एक ===संकेत यह देखने के लिए है कि क्या दो चर / घातांक / स्थिरांक समान ANDहैं - दोनों एक ही प्रकार के हैं या दोनों पूर्णांक हैं।


67

देखोstrpos() :

<?php
    $mystring = 'abc';
    $findme   = 'a';
    $pos = strpos($mystring, $findme);

    // Note our use of ===. Simply, == would not work as expected
    // because the position of 'a' was the 0th (first) character.
    if ($pos === false) {
        echo "The string '$findme' was not found in the string '$mystring'.";
    }
    else {
        echo "The string '$findme' was found in the string '$mystring',";
        echo " and exists at position $pos.";
    }
?>

62

का उपयोग करना strstr()या stristr()अगर आपकी खोज के मामले में असंवेदनशील होना चाहिए तो एक और विकल्प होगा।


9
Php.net/manual/en/function.strstr.php पेज पर एक नोट : नोट: यदि आप केवल यह निर्धारित करना चाहते हैं कि क्या एक विशेष सुई हैस्टैक के भीतर होती है, तो इसके बजाय तेज और कम मेमोरी वाले गहन फ़ंक्शन स्ट्रैप्स () का उपयोग करें।
जो स्मो

@tastro क्या इस पर कोई प्रतिष्ठित बेंचमार्क हैं?
वेन व्हाईट

यह धीमा हो सकता है, लेकिन IMHO strstr($a, 'are')बदसूरत की तुलना में बहुत अधिक सुरुचिपूर्ण है strpos($a, 'are') !== false। PHP को वास्तव में एक str_contains()फ़ंक्शन की आवश्यकता होती है।
पॉल स्पीगल

यह मेरे दिमाग को उड़ा देता है कि यह स्वीकृत उत्तर नहीं है
kurdtpage


45

समरुडी और लेगो स्ट्रोमट्रोप्र टिप्पणियों के लिए पीयर।

यदि आप कई शब्दों की निकटता / प्रासंगिकता के आधार पर खोज परिणामों को रैंक करने के लिए एक PHP एल्गोरिथ्म की तलाश कर रहे हैं, तो केवल PHP के साथ खोज परिणाम उत्पन्न करने का एक त्वरित और आसान तरीका आता है:

अन्य बूलियन खोज के तरीकों के साथ मुद्दों जैसे strpos(), preg_match(), strstr()याstristr()

  1. कई शब्दों के लिए खोज नहीं कर सकते
  2. परिणाम अनियंत्रित हैं

वेक्टर स्पेस मॉडल और tf-idf (टर्म फ़्रीक्वेंसी-उलटा डॉक्यूमेंट फ़्रीक्वेंसी) पर आधारित PHP विधि :

यह मुश्किल लगता है लेकिन आश्चर्यजनक रूप से आसान है।

यदि हम एक स्ट्रिंग में कई शब्दों की खोज करना चाहते हैं तो मूल समस्या यह है कि हम उनमें से हर एक को कैसे एक वजन प्रदान करते हैं?

यदि हम एक स्ट्रिंग में शर्तों को भारित कर सकते हैं, तो इस आधार पर कि वे पूरी तरह से स्ट्रिंग के प्रतिनिधि हैं, हम क्वेरी द्वारा सबसे अच्छा मिलान करने वाले लोगों द्वारा हमारे परिणाम का आदेश दे सकते हैं।

यह वेक्टर स्पेस मॉडल का विचार है, एसक्यूएल फुल-टेक्स्ट सर्च कैसे काम करता है , इससे दूर नहीं:

function get_corpus_index($corpus = array(), $separator=' ') {

    $dictionary = array();

    $doc_count = array();

    foreach($corpus as $doc_id => $doc) {

        $terms = explode($separator, $doc);

        $doc_count[$doc_id] = count($terms);

        // tf–idf, short for term frequency–inverse document frequency, 
        // according to wikipedia is a numerical statistic that is intended to reflect 
        // how important a word is to a document in a corpus

        foreach($terms as $term) {

            if(!isset($dictionary[$term])) {

                $dictionary[$term] = array('document_frequency' => 0, 'postings' => array());
            }
            if(!isset($dictionary[$term]['postings'][$doc_id])) {

                $dictionary[$term]['document_frequency']++;

                $dictionary[$term]['postings'][$doc_id] = array('term_frequency' => 0);
            }

            $dictionary[$term]['postings'][$doc_id]['term_frequency']++;
        }

        //from http://phpir.com/simple-search-the-vector-space-model/

    }

    return array('doc_count' => $doc_count, 'dictionary' => $dictionary);
}

function get_similar_documents($query='', $corpus=array(), $separator=' '){

    $similar_documents=array();

    if($query!=''&&!empty($corpus)){

        $words=explode($separator,$query);

        $corpus=get_corpus_index($corpus, $separator);

        $doc_count=count($corpus['doc_count']);

        foreach($words as $word) {

            if(isset($corpus['dictionary'][$word])){

                $entry = $corpus['dictionary'][$word];


                foreach($entry['postings'] as $doc_id => $posting) {

                    //get term frequency–inverse document frequency
                    $score=$posting['term_frequency'] * log($doc_count + 1 / $entry['document_frequency'] + 1, 2);

                    if(isset($similar_documents[$doc_id])){

                        $similar_documents[$doc_id]+=$score;

                    }
                    else{

                        $similar_documents[$doc_id]=$score;

                    }
                }
            }
        }

        // length normalise
        foreach($similar_documents as $doc_id => $score) {

            $similar_documents[$doc_id] = $score/$corpus['doc_count'][$doc_id];

        }

        // sort from  high to low

        arsort($similar_documents);

    }   

    return $similar_documents;
}

मामला एक

$query = 'are';

$corpus = array(
    1 => 'How are you?',
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

परिणाम

Array
(
    [1] => 0.52832083357372
)

मामला 2

$query = 'are';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

परिणाम

Array
(
    [1] => 0.54248125036058
    [3] => 0.21699250014423
)

मामला 3

$query = 'we are done';

$corpus = array(
    1 => 'how are you today?',
    2 => 'how do you do',
    3 => 'here you are! how are you? Are we done yet?'
);

$match_results=get_similar_documents($query,$corpus);
echo '<pre>';
    print_r($match_results);
echo '</pre>';

परिणाम

Array
(
    [3] => 0.6813781191217
    [1] => 0.54248125036058
)

बहुत सारे सुधार किए जाने हैं, लेकिन मॉडल प्राकृतिक प्रश्नों से अच्छे परिणाम प्राप्त करने का एक तरीका प्रदान करता है, जिनके पास बूलियन ऑपरेटर नहीं हैं strpos(), जैसे preg_match(), strstr()या stristr()

नोट नहीं

वैकल्पिक रूप से शब्दों को खोजने से पहले अतिरेक को समाप्त करना

  • जिससे सूचकांक का आकार कम हो जाता है और परिणामस्वरूप भंडारण की आवश्यकता कम हो जाती है

  • कम डिस्क I / O

  • तेजी से अनुक्रमण और परिणामस्वरूप तेजी से खोज।

1. सामान्यीकरण

  • सभी टेक्स्ट को लोअर केस में कन्वर्ट करें

2. स्टॉपवर्ड एलिमिनेशन

  • पाठ से उन शब्दों को हटा दें जो कोई वास्तविक अर्थ नहीं रखते हैं (जैसे 'और', 'या', 'द', 'फॉर', आदि)।

3. शब्दकोश प्रतिस्थापन

  • उन शब्दों को दूसरों के साथ बदलें, जिनके समान या समान अर्थ हैं। (पूर्व: 'भूख' के साथ 'भूखे' और 'भूखे' के उदाहरणों को बदलें)

  • आगे एल्गोरिदम उपायों (स्नोबॉल) को उनके आवश्यक अर्थ के लिए शब्दों को और कम करने के लिए किया जा सकता है।

  • उनके हेक्साडेसिमल समकक्षों के साथ रंग नामों का प्रतिस्थापन

  • परिशुद्धता को कम करके संख्यात्मक मूल्यों की कमी पाठ को सामान्य करने के अन्य तरीके हैं।

संसाधन


40

यदि आप "गलत" और "सत्य" समस्या से बचना चाहते हैं, तो आप root_count का उपयोग कर सकते हैं:

if (substr_count($a, 'are') > 0) {
    echo "at least one 'are' is present!";
}

यह स्ट्रैप्स की तुलना में थोड़ा धीमा है लेकिन यह तुलनात्मक समस्याओं से बचता है।


यह false"क्या आपको यकीन है?" के बाद से स्थिति strposहै0
Hafenkranich

30

एक और विकल्प स्ट्रैस () फ़ंक्शन का उपयोग करना है। कुछ इस तरह:

if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}

ध्यान दें: स्ट्रैस () फ़ंक्शन केस-संवेदी है। केस-असंवेदनशील खोज के लिए, स्ट्रिंग () फ़ंक्शन का उपयोग करें ।


1
स्ट्रैस () FALSE देता है अगर सुई नहीं मिली। तो एक स्ट्रलैन आवश्यक नहीं है।
आयश के।

29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}

3
मुझे निम्नलिखित चेतावनी मिल रही है:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Pathros

27

मैं थोड़ा प्रभावित हूं कि यहां कोई भी जवाब नहीं दिया गया है strpos, strstrऔर इसी तरह के कार्यों ने मल्टीबाइट स्ट्रिंग फ़ंक्शंस का उल्लेख किया है (2015-05-08)।

मूल रूप से, यदि आपको कुछ भाषाओं के लिए विशिष्ट वर्ण वाले शब्दों को खोजने में समस्या हो रही है ऐसी जर्मन, फ्रेंच, पुर्तगाली, स्पेनिश, आदि के रूप में, (जैसे: ä , é , ô , ç , º , ñ ), तो आपको पहले आना चाहते हो सकता है के साथ कार्य करता है mb_। इसलिए, स्वीकृत उत्तर का उपयोग करेगा mb_strposया mb_stripos(केस-असंवेदनशील मिलान के लिए) इसके बजाय:

if (mb_strpos($a,'are') !== false) {
    echo 'true';
}

यदि आप यह गारंटी नहीं दे सकते कि आपका सारा डेटा UTF-8 में 100% है , तो आप mb_फ़ंक्शन का उपयोग करना चाह सकते हैं ।

यह समझने के लिए एक अच्छा लेख कि निरपेक्ष न्यूनतम हर सॉफ्टवेयर डेवलपर क्यों होता है , जोएल स्पोलस्की द्वारा यूनिकोड और कैरेक्टर सेट (कोई बहाना नहीं!) के बारे में सकारात्मक रूप से जानना चाहिए


25

PHP में, यह सत्यापित करने का सबसे अच्छा तरीका है कि अगर स्ट्रिंग में एक निश्चित सबस्ट्रिंग है, तो इस तरह से एक साधारण सहायक फ़ंक्शन का उपयोग करना है:

function contains($haystack, $needle, $caseSensitive = false) {
    return $caseSensitive ?
            (strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
            (stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}

स्पष्टीकरण:

  • strpos एक स्ट्रिंग में केस-संवेदी प्रतिस्थापन की पहली घटना की स्थिति का पता लगाता है।
  • stripos एक स्ट्रिंग में केस-असंवेदनशील प्रतिस्थापन की पहली घटना की स्थिति का पता लगाता है।
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUEसुनिश्चित करता है कि myFunctionहमेशा एक बूलियन लौटाता है और अप्रत्याशित व्यवहार को ठीक करता है जब सबस्ट्रिंग का सूचकांक 0 होता है।
  • $caseSensitive ? A : B या तो चयन करता है strposstriposके मान के आधार पर या काम काम करता है $caseSensitive

आउटपुट:

var_dump(contains('bare','are'));            // Outputs: bool(true)
var_dump(contains('stare', 'are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are'));          // Outputs: bool(true)
var_dump(contains('stare', 'Are', true));    // Outputs: bool(false)
var_dump(contains('hair', 'are'));           // Outputs: bool(false)
var_dump(contains('aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are'));        // Outputs: bool(true)
var_dump(contains('Aren\'t', 'are', true));  // Outputs: bool(false)
var_dump(contains('aren\'t', 'Are'));        // Outputs: bool(true)
var_dump(contains('aren\'t', 'Are', true));  // Outputs: bool(false)
var_dump(contains('broad', 'are'));          // Outputs: bool(false)
var_dump(contains('border', 'are'));         // Outputs: bool(false)

22

नीचे दिया गया फ़ंक्शन भी काम करता है और किसी अन्य फ़ंक्शन पर निर्भर नहीं करता है; यह केवल मूल PHP स्ट्रिंग हेरफेर का उपयोग करता है। व्यक्तिगत रूप से, मैं इसकी अनुशंसा नहीं करता, लेकिन आप देख सकते हैं कि यह कैसे काम करता है:

<?php

if (!function_exists('is_str_contain')) {
  function is_str_contain($string, $keyword)
  {
    if (empty($string) || empty($keyword)) return false;
    $keyword_first_char = $keyword[0];
    $keyword_length = strlen($keyword);
    $string_length = strlen($string);

    // case 1
    if ($string_length < $keyword_length) return false;

    // case 2
    if ($string_length == $keyword_length) {
      if ($string == $keyword) return true;
      else return false;
    }

    // case 3
    if ($keyword_length == 1) {
      for ($i = 0; $i < $string_length; $i++) {

        // Check if keyword's first char == string's first char
        if ($keyword_first_char == $string[$i]) {
          return true;
        }
      }
    }

    // case 4
    if ($keyword_length > 1) {
      for ($i = 0; $i < $string_length; $i++) {
        /*
        the remaining part of the string is equal or greater than the keyword
        */
        if (($string_length + 1 - $i) >= $keyword_length) {

          // Check if keyword's first char == string's first char
          if ($keyword_first_char == $string[$i]) {
            $match = 1;
            for ($j = 1; $j < $keyword_length; $j++) {
              if (($i + $j < $string_length) && $keyword[$j] == $string[$i + $j]) {
                $match++;
              }
              else {
                return false;
              }
            }

            if ($match == $keyword_length) {
              return true;
            }

            // end if first match found
          }

          // end if remaining part
        }
        else {
          return false;
        }

        // end for loop
      }

      // end case4
    }

    return false;
  }
}

परीक्षा:

var_dump(is_str_contain("test", "t")); //true
var_dump(is_str_contain("test", "")); //false
var_dump(is_str_contain("test", "test")); //true
var_dump(is_str_contain("test", "testa")); //flase
var_dump(is_str_contain("a----z", "a")); //true
var_dump(is_str_contain("a----z", "z")); //true 
var_dump(is_str_contain("mystringss", "strings")); //true 

13
क्या आप मुझे बता सकते हैं कि दुनिया में आप इस तरह के एक फ़ंक्शन का उपयोग क्यों करेंगे, जब स्ट्रैप एक पूरी तरह से व्यवहार्य समाधान है? ...
sg3s

3
@ sg3s: आप पूरी तरह से सही हैं, हालांकि, स्ट्रैप्स भी कुछ इस तरह से आधारित है, साथ ही, मैंने इसे केवल ज्ञान के एक छोटे से साझा करने के लिए प्रतिनिधि के लिए पोस्ट नहीं किया
जेसन OOO

अंतिम var_dump गलत है
सनी

1
@Sunny: यह टाइपो था: var_dump (is_str_contain ("मिस्ट्रीस", "स्ट्रिंग्स")); // सच
जेसन OOO

22

आप strstrफ़ंक्शन का उपयोग कर सकते हैं :

$haystack = "I know programming";
$needle   = "know";
$flag = strstr($haystack, $needle);

if ($flag){

    echo "true";
}

इनबिल्ट फ़ंक्शन का उपयोग किए बिना:

$haystack  = "hello world";
$needle = "llo";

$i = $j = 0;

while (isset($needle[$i])) {
    while (isset($haystack[$j]) && ($needle[$i] != $haystack[$j])) {
        $j++;
        $i = 0;
    }
    if (!isset($haystack[$j])) {
        break;
    }
    $i++;
    $j++;

}
if (!isset($needle[$i])) {
    echo "YES";
}
else{
    echo "NO ";
}

2
यदि आप पहले शब्द को खोजते हैं तो दुर्घटनाएँ
T30

20

मुझे इससे कुछ परेशानी हुई, और आखिरकार मैंने अपना समाधान बनाने के लिए चुना। नियमित अभिव्यक्ति इंजन का उपयोग किए बिना :

function contains($text, $word)
{
    $found = false;
    $spaceArray = explode(' ', $text);

    $nonBreakingSpaceArray = explode(chr(160), $text);

    if (in_array($word, $spaceArray) ||
        in_array($word, $nonBreakingSpaceArray)
       ) {

        $found = true;
    }
    return $found;
 }

आप देख सकते हैं कि पिछले समाधान दूसरे के लिए उपसर्ग के रूप में इस्तेमाल किए जा रहे शब्द का जवाब नहीं हैं। अपने उदाहरण का उपयोग करने के लिए:

$a = 'How are you?';
$b = "a skirt that flares from the waist";
$c = "are";

ऊपर के नमूनों के साथ, दोनों में $aऔर $bशामिल हैं $c, लेकिन आप अपने फ़ंक्शन को यह बताना चाहते हैं कि केवल $aशामिल हैं $c


1
आप शायद मतलब है: $found = falseशुरुआत में
मंदी

1
यदि शब्द अल्पविराम, प्रश्नवाचक चिह्न या बिंदु के साथ जुड़ा हुआ है तो आपका कार्य नहीं हो सकता है। उदाहरण के लिए "आप जो देखते हैं वही आपको मिलता है।" और आप यह निर्धारित करना चाहते हैं कि क्या "प्राप्त" वाक्य में है। "पाने" के बगल में पूर्ण विराम पर ध्यान दें। इस स्थिति में, आपका फ़ंक्शन गलत है। स्ट्रिंग्स को खोजने / बदलने के लिए नियमित अभिव्यक्ति या रूट (मुझे लगता है कि यह वैसे भी नियमित अभिव्यक्ति का उपयोग करता है) का उपयोग करने की सिफारिश की जाती है।
लाइटब्रिंगर

@lightbringer आपकी अनुशंसा से अधिक गलत नहीं हो सकता है, आपके लिए इसका क्या मतलब है "यह अनुशंसित है"? कोई भी सर्वोच्च व्यक्ति ऐसा नहीं है जो अनुशंसा करता है या काम करता है। यह php में नियमित अभिव्यक्ति इंजन के उपयोग के बारे में है जो कि भाषा में ही एक ब्लैकहोल है, आप एक लूप में एक रेगेक्स मैच डालने की कोशिश कर सकते हैं और परिणामों को बेंचमार्क कर सकते हैं।
डेसेबल

यह उत्तर खराब प्रदर्शन है और कई विस्तारित परिदृश्यों के साथ विफल रहता है। मुझे इस तकनीक के मनोरंजन में कोई लाभ नहीं दिखाई दे रहा है। यहां परिष्कृत कस्टम फ़ंक्शन और पुनरावृत्त कॉल है: 3v4l.org/E9dfD मुझे इस विकी को संपादित करने में कोई दिलचस्पी नहीं है क्योंकि मुझे लगता है कि यह शोधकर्ताओं के समय के लिए बेकार है।
मिकमेकुसा

18

का उपयोग कर एक स्ट्रिंग से एक शब्द की घटना पाने के लिए एक अन्य विकल्प strstr () और stristr () निम्नलिखित की तरह है:

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>

यह पीछे की तरफ है। iमें stristrअसंवेदनशील के लिए खड़ा है।
एडम मेरिफ़िल्ड

18

substr_countयदि परिणाम है तो चेक का उपयोग करने वाले उत्तर के बहुत >0। लेकिन चूंकि ifकथन शून्य को असत्य मानता है , आप उस जाँच से बच सकते हैं और सीधे लिख सकते हैं:

if (substr_count($a, 'are')) {

यह देखने के लिए कि क्या मौजूद नहीं है , !ऑपरेटर जोड़ें :

if (!substr_count($a, 'are')) {

ठीक है ... आंशिक रूप से सच है, php में 0 == असत्य सत्य है, लेकिन 0 === असत्य गलत है
बेपन्स गबर

17

इसे तीन अलग-अलग तरीकों से किया जा सकता है:

 $a = 'How are you?';

1- स्ट्रिस्टर ()

 if (strlen(stristr($a,"are"))>0) {
    echo "true"; // are Found
 } 

2- स्ट्रैप ()

 if (strpos($a, "are") !== false) {
   echo "true"; // are Found
 }

3- प्रीग_मैच ()

 if( preg_match("are",$a) === 1) {
   echo "true"; // are Found
 }

अच्छा है, लेकिन preg_match जोखिम भरा है क्योंकि यह गलत हो सकता है या 0. आप # 3 में === 1 के लिए परीक्षण कर रहे होंगे
Shapeshifter

14

लघु-हस्त संस्करण

$result = false!==strpos($a, 'are');

5
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
बोनो

14

अक्षरों की एक श्रृंखला की घटना के बजाय एक 'शब्द' खोजने के लिए, जो वास्तव में दूसरे शब्द का हिस्सा हो सकता है, निम्नलिखित एक अच्छा समाधान होगा।

$string = 'How are you?';
$array = explode(" ", $string);

if (in_array('are', $array) ) {
    echo 'Found the word';
}

5
यह विफल हो जाएगा अगर $stringहैAre are, are?
सनी

13

आपको केस असंवेदनशील प्रारूप का उपयोग करना चाहिए, इसलिए यदि दर्ज मूल्य में है smallया capsयह अभ्यस्त मामला है।

<?php
$grass = "This is pratik joshi";
$needle = "pratik";
if (stripos($grass,$needle) !== false) { 

 /*If i EXCLUDE : !== false then if string is found at 0th location, 
   still it will say STRING NOT FOUND as it will return '0' and it      
   will goto else and will say NOT Found though it is found at 0th location.*/
    echo 'Contains word';
}else{
    echo "does NOT contain word";
}
?>

यहाँ स्ट्रिप केस (छोटे / कैप) पर विचार किए बिना हीस्टैक में सुई लगाता है ।

आउटपुट के साथ PHPCode नमूना


13

शायद आप इस तरह से कुछ का उपयोग कर सकते हैं:

<?php
    findWord('Test all OK');

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a word';
        }
    }
?>

12

preg_match()यदि आप केवल एक स्ट्रिंग दूसरे स्ट्रिंग में समाहित करना चाहते हैं, तो इसका उपयोग न करें । उपयोग strpos()या strstr()इसके बजाय वे तेज हो जाएगा। ( http://in2.php.net/preg_match )

if (strpos($text, 'string_name') !== false){
   echo 'get the string';
}

12

यदि आप जांचना चाहते हैं कि क्या स्ट्रिंग में कई विशिष्ट शब्द हैं, तो आप कर सकते हैं:

$badWords = array("dette", "capitale", "rembourser", "ivoire", "mandat");

$string = "a string with the word ivoire";

$matchFound = preg_match_all("/\b(" . implode($badWords,"|") . ")\b/i", $string, $matches);

if ($matchFound) {
    echo "a bad word has been found";
}
else {
    echo "your string is okay";
}

उदाहरण के लिए ईमेल भेजते समय स्पैम से बचने के लिए यह उपयोगी है।


10

स्ट्रैप फंक्शन ठीक काम करता है, लेकिन अगर आप case-insensitiveपैराग्राफ में किसी शब्द के लिए चेकिंग करना चाहते हैं तो आप striposफंक्शन का उपयोग कर सकते हैं PHP

उदाहरण के लिए,

$result = stripos("I love PHP, I love PHP too!", "php");
if ($result === false) {
    // Word does not exist
}
else {
    // Word exists
}

एक स्ट्रिंग में केस-असंवेदनशील प्रतिस्थापन की पहली घटना की स्थिति का पता लगाएं।

यदि शब्द स्ट्रिंग में मौजूद नहीं है, तो यह झूठी स्थिति में वापस आ जाएगा और यह शब्द की स्थिति को वापस कर देगा।


9

आपको समान / समान समरूप संचालकों का उपयोग करने की आवश्यकता नहीं है क्योंकि स्ट्रैप 0 वापस आ सकता है क्योंकि यह सूचकांक मूल्य है। यदि आपको टर्नरी ऑपरेटर पसंद हैं, तो निम्नलिखित का उपयोग करने पर विचार करें (लगता है कि मैं पीछे से थोड़ा पीछे हटूंगा):

echo FALSE === strpos($a,'are') ? 'false': 'true';

8

जांचें कि क्या स्ट्रिंग में विशिष्ट शब्द हैं?

इसका मतलब है कि स्ट्रिंग को शब्दों में हल करना होगा (नीचे नोट देखें)।

ऐसा करने और विभाजकों को निर्दिष्ट करने का एक तरीका उपयोग कर रहा है preg_split( डॉक्टर ):

<?php

function contains_word($str, $word) {
  // split string into words
  // separators are substrings of at least one non-word character
  $arr = preg_split('/\W+/', $str, NULL, PREG_SPLIT_NO_EMPTY);

  // now the words can be examined each
  foreach ($arr as $value) {
    if ($value === $word) {
      return true;
    }
  }
  return false;
}

function test($str, $word) {
  if (contains_word($str, $word)) {
    echo "string '" . $str . "' contains word '" . $word . "'\n";
  } else {
    echo "string '" . $str . "' does not contain word '" . $word . "'\n" ;
  }
}

$a = 'How are you?';

test($a, 'are');
test($a, 'ar');
test($a, 'hare');

?>

एक रन देता है

$ php -f test.php                   
string 'How are you?' contains word 'are' 
string 'How are you?' does not contain word 'ar'
string 'How are you?' does not contain word 'hare'

नोट: यहाँ हम प्रतीकों के प्रत्येक अनुक्रम के लिए शब्द का अर्थ नहीं है।

शब्द की एक व्यावहारिक परिभाषा पीसीआरई नियमित अभिव्यक्ति इंजन के अर्थ में है, जहां शब्द केवल शब्द वर्णों से बने होते हैं, गैर-शब्द वर्णों द्वारा अलग किए जा रहे हैं।

एक "शब्द" वर्ण किसी भी अक्षर या अंक या अंडरस्कोर वर्ण है, अर्थात्, कोई भी चरित्र जो एक पर्ल शब्द का हिस्सा हो सकता है "। अक्षरों और अंकों की परिभाषा को PCRE के चरित्र तालिकाओं द्वारा नियंत्रित किया जाता है, और यदि लोकेल-विशिष्ट मिलान हो रहा है तो यह भिन्न हो सकता है (..)


7

विशिष्ट स्ट्रिंग के लिए एक और समाधान:

$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
    echo true;
}

आप strpos()फ़ंक्शन का उपयोग भी कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.