[Php] كيف أتحقق مما إذا كانت السلسلة تحتوي على كلمة محددة؟


Answers

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

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

$a = 'How are you?';

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

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

Question

يعتبر:

$a = 'How are you?';

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

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




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

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

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



الاستفادة من مطابقة حالة عدم التوافق مع استخدام stripos() :

if (stripos($string,$stringToSearch) !== false) {
    echo 'true';
}



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

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

هذا مفيد لتجنب البريد المزعج عند إرسال رسائل البريد الإلكتروني على سبيل المثال.




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



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

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 .




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

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



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

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



لتحديد ما إذا كانت سلسلة تحتوي على سلسلة أخرى يمكنك استخدام strpos() الدالة PHP 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';
}

?>

الحذر:

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

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

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




في 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($haystack, $needle) === FALSE ? FALSE : TRUE تضمن myFunction($haystack, $needle) === FALSE ? FALSE : TRUE أن myFunction دائمًا تقوم بإرجاع قيمة منطقية ويتم إصلاح سلوك غير متوقع عندما يكون فهرس السلسلة الفرعية هو 0.
  • $caseSensitive ? A : B $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)



هنا هي وظيفة فائدة صغيرة مفيدة في حالات مثل هذا

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



يجب عليك استخدام صيغة غير حساسة لحالة الأحرف ، لذلك إذا كانت القيمة المدخلة small أو كبيرة ، فلا يهم الأمر.

<?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 مع الإخراج




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

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

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




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

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

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

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



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