it-swarm.asia

كيف يمكنني التحقق مما إذا كانت السلسلة تحتوي على كلمة معينة؟

يعتبر:

$a = 'How are you?';

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

افترض أن لدي الكود أعلاه ، ما هي الطريقة الصحيحة لكتابة العبارة if ($a contains 'are')؟

2666
Charles Yeung

يمكنك استخدام strpos() الدالة التي يتم استخدامها للعثور على حدوث سلسلة واحدة داخل أخرى:

$a = 'How are you?';

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

لاحظ أن استخدام !== false متعمد ؛ strpos() تُرجع إما الإزاحة التي تبدأ عندها سلسلة الإبرة في سلسلة كومة قش ، أو منطقية false إذا لم يتم العثور على الإبرة. نظرًا لأن 0 عبارة عن إزاحة صالحة و 0 "خاطئ" ، لا يمكننا استخدام تصميمات أبسط مثل !strpos($a, 'are').

6129
codaddict

يمكنك استخدام تعبيرات عادية ، فمن الأفضل لمطابقة الكلمات مقارنة بـ strpos كما ذكر المستخدمون الآخرون ، كما أنه سيُرجع أيضًا إلى سلاسل مثل الأجرة ، والرعاية ، التحديق ، وما إلى ذلك. يمكن تجنب ذلك ببساطة في تعبير عادي باستخدام حدود Word.

يمكن أن تبدو المطابقة البسيطة لـ مثل هذا:

$a = 'How are you?';

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

على جانب الأداء ، يكون strpos أسرع بثلاث مرات وأخذ في الاعتبار ، عندما أجريت مليون مقارنة في آن واحد ، استغرق الأمر preg_match 1.5 ثانية حتى النهاية ولمدة strpos استغرق الأمر 0.5 ثانية.

تحرير: للبحث في أي جزء من السلسلة ، وليس فقط Word بواسطة Word ، أوصي باستخدام تعبير عادي مثل

$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.
}
528
Breezer

فيما يلي وظيفة الأداة المساعدة المفيدة في مواقف مثل هذه

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

على الرغم من أن معظم هذه الإجابات سوف تخبرك ما إذا كانت سلسلة فرعية تظهر في سلسلتك ، إلا أن هذا ليس هو ما تريده عادة إذا كنت تبحث عن معين Word ، وليس سلسلة فرعية .

ماهو الفرق؟ يمكن أن تظهر السلاسل الفرعية بكلمات أخرى:

  • "هم" في بداية "المنطقة"
  • "هم" في نهاية "الأرنب"
  • "هم" في منتصف "فارس"

تتمثل إحدى طرق التخفيف من ذلك في استخدام تعبير عادي إلى جانب حدود Word (\b):

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

لا تحتوي هذه الطريقة على نفس الإيجابيات الخاطئة المذكورة أعلاه ، ولكن لديها بعض حالات Edge الخاصة بها. تتطابق حدود الكلمات مع الأحرف غير التابعة لـ Word (\W) ، والتي ستكون أي شيء ليس a-z أو A-Z أو 0-9 أو _. هذا يعني أن الأرقام والشُرَط السفلية ستُحسب كأحرف Word وسيناريوهات مثل هذه ستفشل:

  • "هم" في "ماذا تفكر؟"
  • "هل" في "لول يو دون هؤلاء هم 4؟"

إذا كنت تريد أي شيء أكثر دقة من هذا ، فسوف يتعين عليك البدء في إجراء تحليل لغوي للغة الإنجليزية ، وهذه علبة كبيرة جدًا للديدان (وتفترض الاستخدام الصحيح لبناء الجملة ، على أي حال ، وهو أمر غير معطى دائمًا).

128
FtDRbwLXw6

لتحديد ما إذا كانت السلسلة تحتوي على سلسلة أخرى ، يمكنك استخدام PHP function strpos () .

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";
}

?>

تنبيه:

إذا كانت الإبرة التي تبحث عنها في بداية haystack فستعود الموضع 0 ، إذا قمت بإجراء == مقارنة لن تعمل ، فستحتاج إلى ===

علامة == هي مقارنة وتختبر ما إذا كان المتغير/التعبير/الثابت إلى اليسار له نفس قيمة المتغير/التعبير/الثابت إلى اليمين.

علامة === هي مقارنة لمعرفة ما إذا كان المتغيران/expresions/الثوابت متساويان AND لهما نفس النوع - أي كلاهما عبارة عن سلاسل أو كليهما أعداد صحيحة.

109
Jose Vega

انظر إلى 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.";
    }
?>
59
Haim Evgi

استخدام strstr() أو stristr() إذا كان يجب أن يكون البحث غير حساس لحالة الأحرف سيكون خيارًا آخر.

58
glutorange

نظير لـ SamGoody و Lego Stormtroopr.

إذا كنت تبحث عن خوارزمية PHP إلى ترتيب نتائج البحث على أساس القرب/الصلة من الكلمات المتعددة هنا تأتي وسيلة سريعة وسهلة لتوليد نتائج البحث مع PHP فقط:

مشاكل مع أساليب البحث المنطقية الأخرى مثل strpos() أو preg_match() أو strstr() أو stristr()

  1. لا يمكن البحث عن كلمات متعددة
  2. النتائج غير مرتبة

PHPطريقة تعتمد على نموذج مساحة المتجه و tf-idf (تردد المدى - تردد المستند العكسي):

يبدو صعبا لكنه سهل بشكل مدهش.

إذا كنا نريد البحث عن كلمات متعددة في سلسلة ، فالمشكلة الأساسية هي كيف نعطي وزناً لكل منها؟

إذا استطعنا وزن المصطلحات في السلسلة بناءً على مدى تمثيلها للسلسلة ككل ، فيمكننا ترتيب نتائجنا بالنتائج التي تطابق الاستعلام على أفضل وجه.

هذه هي فكرة نموذج مساحة المتجه ، ليست بعيدة عن كيفية عمل بحث النص الكامل في SQL:

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;
}

الحالة 1

$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().

NOTA BENE

إلغاء التكرار اختياريًا قبل البحث عن الكلمات

  • وبالتالي تقليل حجم الفهرس وتقليل متطلبات التخزين

  • أقل القرص I/O

  • أسرع الفهرسة وبالتالي أسرع البحث.

1. التطبيع

  • تحويل كل النص إلى أحرف صغيرة

2. إزالة الكلمات الرئيسية

  • احذف الكلمات من النص التي لا تحمل أي معنى حقيقي (مثل "و" ، "أو" ، "the" ، "for" ، إلخ.)

3. استبدال القاموس

  • استبدال الكلمات بأخرى لها معنى مماثل أو مشابه. (مثال: استبدال حالات "الجوع" و "الجوع" بعبارة "الجوع")

  • قد يتم تنفيذ تدابير حسابية أخرى (كرة الثلج) لزيادة تقليل الكلمات إلى معناها الأساسي.

  • استبدال أسماء الألوان بمكافئاتها السداسية عشرية

  • يعد تقليل القيم الرقمية عن طريق تقليل الدقة طرقًا أخرى لتطبيع النص.

الموارد

43
RafaSashi

إذا كنت تريد تجنب مشكلة "خطأ" و "صدق" ، يمكنك استخدام substr_count:

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

إنه أبطأ قليلاً من strpos ولكنه يتجنب مشاكل المقارنة.

40
Alan Piralla

خيار آخر هو استخدام strstr () الدالة. شيء مثل:

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

أشر إلى ملاحظة: الدالة strstr () حساسة لحالة الأحرف. للبحث غير حساس لحالة الأحرف ، استخدم الدالة stristr () .

31
YashG99

لقد تأثرت بعض الشيء بأن أياً من الإجابات التي استخدمت هنا strpos و strstr والوظائف المماثلة المذكورة وظائف السلسلة متعددة البايتات بعد (2015-05-08).

بشكل أساسي ، إذا كنت تواجه مشكلة في البحث عن كلمات ذات أحرف خاصة ببعض اللغات ، مثل الألمانية والفرنسية والبرتغالية والإسبانية وما إلى ذلك (مثل: ä ، é، ô، ç، º، ñ) ، قد ترغب في تسبق الوظائف مع mb_. لذلك ، فإن الإجابة المقبولة تستخدم mb_strpos أو mb_stripos (للمطابقة غير الحساسة لحالة الأحرف) بدلاً من ذلك:

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

إذا كنت لا تستطيع ضمان أن جميع بياناتك 100 ٪ في UTF-8 ، فقد ترغب في استخدام وظائف mb_.

مقال جيد لفهم لماذا الحد الأدنى المطلق لكل مطور برامج يجب أن يعرف تمامًا وإيجابيًا عن يونيكود ومجموعات الأحرف (بلا أعذار!) بواسطة جويل سبولسكي.

28
Armfoot
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
28
joan16v

تعمل الوظيفة أدناه أيضًا ولا تعتمد على أي وظيفة أخرى ؛ يستخدم التلاعب سلسلة الأصلي 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 
23
Jason OOO

في 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 يختار إما strpos أو stripos للقيام بالعمل ، اعتمادًا على قيمة $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
John Slegers

يمكنك استخدام الدالة 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 ";
}
21
Arshid KV

لقد واجهت بعض المشاكل في هذا الأمر ، وأخيراً اخترت إنشاء حل خاص بي. بدون استخدام تعبير عادي محرك:

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;
 }

قد تلاحظ أن الحلول السابقة ليست إجابة عن استخدام Word كبادئة لآخر. من أجل استخدام مثالك:

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

باستخدام العينات الموضحة أعلاه ، يحتوي كل من $a و $b على $c ، لكن قد ترغب في أن تعلمك وظيفتك أن $a فقط يحتوي على $c.

21
Decebal

خيار آخر للعثور على تواجد Word من سلسلة باستخدام strstr () و stristr () يشبه ما يلي:

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

من أجل العثور على "كلمة" ، بدلاً من حدوث سلسلة من الحروف التي يمكن أن تكون في الواقع جزءًا من كلمة أخرى ، فإن التالي سيكون حلاً جيدًا.

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

if (in_array('are', $array) ) {
    echo 'Found the Word';
}
14
DJC

يمكن القيام بذلك بثلاث طرق مختلفة:

 $a = 'How are you?';

1- stristr ()

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

2- ستروس ()

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

3- preg_match ()

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

نسخة قصيرة اليد

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

يجب عليك استخدام تنسيق Insensitive لحالة الأحرف ، لذلك إذا كانت القيمة التي تم إدخالها في 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";
}
?>

هنا يجد stripos إبرة في heystack بدون النظر في القضية (صغيرة/قبعات).

نموذج PHPCode مع الإخراج

13
Pratik C Joshi

الكثير من الإجابات التي تستخدم substr_count الشيكات إذا كانت النتيجة >0. ولكن نظرًا لأن عبارة if تعتبر الصفر نفس العبارة false ، فيمكنك تجنب هذا التحقق والكتابة مباشرةً:

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

لمعرفة ما إذا كان لا موجودًا ، أضف عامل التشغيل !:

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

ربما يمكنك استخدام شيء مثل هذا:

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

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

لا تستخدم preg_match() إذا كنت تريد فقط التحقق مما إذا كانت هناك سلسلة موجودة في سلسلة أخرى. استخدم strpos() أو strstr() بدلاً من ذلك لأنها ستكون أسرع. ( http://in2.php.net/preg_match )

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

إذا كنت تريد التحقق مما إذا كانت السلسلة تحتوي على عدة كلمات محددة ، يمكنك القيام بما يلي:

$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
Julien

تحتاج إلى استخدام عوامل تشغيل متطابقة/غير متطابقة لأن strpos يمكن أن تُرجع 0 لأنها قيمة فهرس. إذا كنت تحب عوامل التشغيل الثلاثية ، ففكر في استخدام ما يلي (يبدو إلى الوراء قليلاً سأعترف به):

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

تعمل وظيفة strpos بشكل جيد ، ولكن إذا كنت تريد القيام case-insensitive بالتحقق من وجود كلمة في فقرة ، فيمكنك الاستفادة من striposPHP.

فمثلا،

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

ابحث عن موضع التواجد الأول لسلسلة فرعية غير متحسسة لحالة الأحرف في سلسلة.

إذا لم يكن Word موجودًا في السلسلة ، فسوف يُرجع خطأً آخر وإلا فسيُرجع موضع الكلمة.

9
Akshay Khale

تحقق مما إذا كانت السلسلة تحتوي على كلمات محددة؟

هذا يعني أنه يجب حل السلسلة في الكلمات (انظر الملاحظة أدناه).

إحدى الطرق للقيام بذلك ولتحديد الفواصل تستخدم preg_split ( doc ):

<?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'

ملاحظة: هنا لا نعني كلمة لكل سلسلة من الرموز.

التعريف العملي لـ Word هو بمعنى محرك التعبير العادي لـ PCRE ، حيث تكون الكلمات عبارة عن سلاسل فرعية تتكون من أحرف Word فقط ، ويتم فصلها بأحرف غير Word.

حرف "Word" هو أي حرف أو رقم أو حرف تسطير أسفل السطر ، أي أي حرف يمكن أن يكون جزءًا من Perl "Word". يتم التحكم في تعريف الحروف والأرقام من خلال جداول الشخصيات في PCRE ، وقد يختلف في حالة حدوث مطابقة خاصة بالإعدادات المحلية (..)

8
mvw

يمكن التحقق من سلسلة مع وظيفة أدناه:

function either_String_existor_not($str, $character) {
    if (strpos($str, $character) !== false) {
        return true;
    }
    return false;
}
7
M Razwan

حل آخر لسلسلة محددة:

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

يمكنك أيضًا استخدام وظيفة strpos().

6
devpro

استعمال:

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
    echo "is exists";
}
5
Kamaro Lambert

خيار أبسط:

return ( ! empty($a) && strpos($a, 'are'))? true : false;
4
ShirleyCC

أعتقد أن الفكرة الجيدة هي استخدام mb_stpos:

$haystack = 'How are you?';
$needle = 'are';

if (mb_strpos($haystack, $needle) !== false) {

    echo 'true';
}

لأن هذا الحل هو حساس لحالة الأحرف و آمن لجميع أحرف Unicode .


ولكن يمكنك أيضًا القيام بذلك مثل هذا ( لم يكن الرد sauch بعد ):

if (count(explode($needle, $haystack)) > 1) {

    echo 'true';
}

هذا الحل أيضًا حساس لحالة الأحرف و آمن لأحرف Unicode .

بالإضافة إلى ذلك لا تستخدم النفي في التعبير ، مما يزيد من قراءة الكود .


هنا حل آخر باستخدام الوظيفة :

function isContainsStr($haystack, $needle) {

    return count(explode($needle, $haystack)) > 1;
}

if (isContainsStr($haystack, $needle)) {

    echo 'true';
}
4
simhumileco

استعمال:

$a = 'How are you?';
if (mb_strpos($a, 'are')) {
    echo 'true';
}

ينفذ عملية strpos () آمنة متعددة البايتات.

3
Mindexperiment

يمكنك أيضًا استخدام وظائف مضمنة strchr() و strrchr() وملحقات لسلاسل متعددة البايتات mb_strchr() و mb_strrchr() . تقوم هذه الدالات بإرجاع أجزاء من السلاسل و FALSE إذا لم يتم العثور على شيء.

  • strchr() - ابحث عن التواجد الأول لسلسلة (اسم مستعار لـ strstr() ).
  • strrchr() - ابحث عن آخر تواجد للحرف في سلسلة.
3
Aleksey Bykov