php - একটি স্ট্রিং একটি নির্দিষ্ট শব্দ রয়েছে কিনা আমি কিভাবে পরীক্ষা করব?




string substring (20)

স্ট্রিং নির্দিষ্ট শব্দ রয়েছে কিনা তা পরীক্ষা করে দেখুন?

এর অর্থ হচ্ছে স্ট্রিংকে শব্দগুলিতে সমাধান করা দরকার (নীচের নোটটি দেখুন)।

এটি করার এবং বিভাজকগুলি নির্দিষ্ট করার এক উপায় হল preg_split ( doc ) ব্যবহার করা হচ্ছে:

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

একটি রান দেয়

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

?>

দ্রষ্টব্য: এখানে আমরা প্রতীক প্রতিটি ক্রম জন্য শব্দ মানে না।

শব্দটির একটি বাস্তব সংজ্ঞা এই অর্থেই পিসিআরই রেগুলার এক্সপ্রেশন ইঞ্জিন, যেখানে শব্দের শব্দগুলি কেবল অক্ষরগুলির সাথে যুক্ত, যা শব্দহীন অক্ষরের দ্বারা পৃথক করা হয়।

একটি "শব্দ" চরিত্রটি কোনও অক্ষর বা সংখ্যা বা আন্ডারস্কোর চরিত্র, যা কোন অক্ষর যা একটি পার্ল "শব্দ" অংশ হতে পারে। অক্ষর এবং সংখ্যার সংজ্ঞাটি পিসিআরির চরিত্রগুলির দ্বারা নিয়ন্ত্রিত হয় এবং লোকেল-নির্দিষ্ট মিললে সঞ্চালিত হয় তবে এটি পরিবর্তিত হতে পারে (..)

বিবেচনা:

$a = 'How are you?';

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

ধরুন আমার উপরে কোড আছে, if ($a contains 'are') বিবৃতিটি লিখার সঠিক উপায় কী?


অক্ষরের একটি সিরিজের ঘটনার পরিবর্তে একটি 'শব্দ' খুঁজে পেতে, যা আসলে অন্য একটি শব্দ হতে পারে, নিম্নলিখিতটি একটি ভাল সমাধান হবে।

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

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

আপনি strpos() ফাংশনটি ব্যবহার করতে পারেন যা অন্য একটির মধ্যে একটি স্ট্রিং এর ঘটনার সন্ধান করতে ব্যবহৃত হয়:

$a = 'How are you?';

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

উল্লেখ্য যে ব্যবহার !== false হয়; strpos() অফসেটটি ফেরত দেয় যেখানে সূঁচ স্ট্রিং হায়স্ট্যাক স্ট্রিংতে শুরু হয়, বা সুলে পাওয়া না থাকলে বুলিয়ান false । যেহেতু 0 একটি বৈধ অফসেট এবং 0 হল "মিথ্যা", আমরা সহজ গঠনগুলি ব্যবহার করতে পারি না !strpos($a, 'are')


আপনি strstr ফাংশন ব্যবহার করতে পারেন:

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

if ($flag){

    echo "true";
}

একটি inbuilt ফাংশন ব্যবহার না করে:

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

আপনি নিয়মিত এক্সপ্রেশনগুলি ব্যবহার করতে পারেন, অন্য ব্যবহারকারীদের দ্বারা উল্লিখিত স্ট্রপগুলির তুলনায় শব্দ মেলাগুলির জন্য এটি আরও ভাল। এটি ভাড়া, যত্ন, ঘড়ির ইত্যাদি স্ট্রিংগুলির জন্যও সত্য ফিরে আসবে। এটি কেবল শব্দ সীমানাগুলি ব্যবহার করে নিয়মিত অভিব্যক্তিতে এড়িয়ে চলতে পারে।

জন্য একটি সহজ ম্যাচ এই মত কিছু দেখতে পারে:

$a = 'How are you?';

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

পারফরম্যান্স পার্শ্বে, স্ট্রপস প্রায় তিনগুণ দ্রুত এবং মনে হয়, যখন আমি এক মিলিয়ন তুলনা একবারে করেছিলাম, তখন এটি 1.5 সেকেন্ডের জন্য প্রিজ ম্যাচটি শেষ করে এবং স্ট্রপসের জন্য এটি 0.5 সেকেন্ড সময় নেয়।


আপনি যদি "মিথ্যা" এবং "সত্যতা" সমস্যা এড়াতে চান তবে আপনি substr_count ব্যবহার করতে পারেন:

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

এটি strpos চেয়ে একটু ধীর কিন্তু এটি তুলনা সমস্যা এড়ানো।


আমি একটু বিস্মিত যে এখানে যে কোনও উত্তর strstr , strstr এবং অনুরূপ ফাংশনগুলির মধ্যে কোনটি এখনো মাল্টিবিট স্ট্রিং ফাংশন উল্লেখ করেনি ( 2015-05-08 )।

মূলত, যদি আপনি কিছু ভাষা যেমন জার্মান, ফ্রেঞ্চ, পর্তুগিজ, স্প্যানিশ ইত্যাদি নির্দিষ্ট অক্ষর দিয়ে শব্দের সন্ধানে সমস্যায় পড়ছেন (উদাহরণ: ä , é , ô , ç , º , ñ ), আপনি পূর্ববর্তী হতে চান mb_ সঙ্গে ফাংশন। অতএব, গ্রহণযোগ্য উত্তরটি mb_strpos বা mb_stripos (কেস-ইনসেন্সিটিভ মিলিংয়ের জন্য) ব্যবহার করবে:

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

আপনি যদি ইউটিএফ -8 তে আপনার সমস্ত তথ্য 100% নিশ্চিত না করতে পারেন তবে আপনি mb_ ফাংশনগুলি ব্যবহার করতে চাইতে পারেন।

নিখুঁত নূন্যতম প্রতিটি সফটওয়্যার বিকাশকারী কেন একেবারে নিখুঁতভাবে বুঝতে হবে তা জানার জন্য একটি ভাল নিবন্ধ , জোয়েল স্পলস্কির দ্বারা ইউনিকোড এবং ক্যারেক্টার সেটগুলি সম্পর্কে কোনও সন্দেহ নেই!


আরেকটি বিকল্প strstr() ফাংশন ব্যবহার করা হয়। কিছুটা এইরকম:

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

উল্লেখ্য পয়েন্ট: strstr () ফাংশন কেস সংবেদনশীল হয়। একটি কেস-অসংবেদী অনুসন্ধানের জন্য, stristr() ফাংশনটি ব্যবহার করুন।


একটি স্ট্রিং অন্য স্ট্রিং আছে কিনা তা নির্ধারণ করতে আপনি পিএইচপি ফাংশন 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 অবস্থান ফিরে আসবে, যদি আপনি এটি করেন == তুলনা করলে এটি কাজ করবে না, আপনাকে একটি === করতে হবে

A == চিহ্নটি একটি তুলনা এবং পরীক্ষা করে কিনা বামে পরিবর্তনশীল / অভিব্যক্তি / বাম দিকে স্থির / পরিবর্তনশীল / ধ্রুবক হিসাবে একই মান রয়েছে।

A === সাইন একটি তুলনা যা দুইটি ভেরিয়েবল / এক্সপ্রেসন / স্টোনেন্ট সমান AND একই রকম থাকে কিনা তা বোঝার অর্থ - অর্থাৎ উভয় স্ট্রিং বা উভয়ই পূর্ণসংখ্যা।


এখানে একটি সামান্য ইউটিলিটি ফাংশন যা এই ধরনের পরিস্থিতিতে দরকারী

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

নীচের ফাংশন কাজ করে এবং অন্য কোন ফাংশন উপর নির্ভর করে না; এটি শুধুমাত্র নেটিভ পিএইচপি স্ট্রিং ম্যানিপুলেশন ব্যবহার করে। ব্যক্তিগতভাবে, আমি এটি সুপারিশ করি না, তবে আপনি কীভাবে এটি কাজ করতে পারেন তা দেখতে পারেন:

<?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($haystack, $needle, $caseSensitive = false) {
    return $caseSensitive ?
            (strpos($haystack, $needle) === FALSE ? FALSE : TRUE):
            (stripos($haystack, $needle) === FALSE ? FALSE : TRUE);
}

ব্যাখ্যা:

  • strpos() একটি স্ট্রিং একটি কেস সংবেদনশীল সংবেদনশীল সারির প্রথম ঘটনার অবস্থান খুঁজে বের করে।
  • stripos() একটি স্ট্রিং-এ একটি কেস- stripos() প্রথম ঘটনার অবস্থান খুঁজে পায়।
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE myFunction($haystack, $needle) === FALSE ? FALSE : TRUE নিশ্চিত করে যে myFunction সর্বদা একটি বুলিয়ান প্রদান করে এবং অপ্রত্যাশিত আচরণ সংশোধন করে যখন myFunction সূচক 0 হয়।
  • $caseSensitive ? A : B $caseSensitive ? A : B $caseSensitive মানের উপর নির্ভর করে, কাজ করতে stripos() বা stripos() নির্বাচন করে।

আউটপুট:

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)

সংক্ষিপ্ত হাতের সংস্করণ

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

স্যামুডি এবং লেগো স্টরমট্রুপারের সহকর্মী মন্তব্য করেছেন।

আপনি যদি পিএইচপি অ্যালগরিদম অনুসন্ধানের ফলাফল অনুসন্ধানের জন্য একাধিক শব্দের কাছাকাছি / প্রাসঙ্গিকতার উপর ভিত্তি করে সন্ধান করেন তবে এখানে কেবল পিএইচপি দিয়ে অনুসন্ধান ফলাফল তৈরি করার দ্রুত এবং সহজ উপায় আসে:

অন্যান্য বুলিয়ান অনুসন্ধান পদ্ধতি যেমন strstr() , preg_match() , strstr() বা stristr()

  1. একাধিক শব্দ জন্য অনুসন্ধান করতে পারবেন না
  2. ফলাফল unranked হয়

ভেক্টর স্পেস মডেল এবং টিএফ-আইডিএফ (শব্দ ফ্রিকোয়েন্সি-বিপরীত নথি ফ্রিকোয়েন্সি) উপর ভিত্তি করে পিএইচপি পদ্ধতি :

এটা কঠিন শব্দ কিন্তু আশ্চর্যজনক সহজ।

যদি আমরা একটি স্ট্রিংয়ের মধ্যে একাধিক শব্দ অনুসন্ধান করতে চাই তবে মূল সমস্যা হল কিভাবে আমরা তাদের প্রতিটিকে ওজন নির্ধারণ করব?

যদি আমরা সম্পূর্ণভাবে স্ট্রিংয়ের প্রতিনিধির প্রতিনিধিত্বের ভিত্তিতে কোন স্ট্রিংয়ের পদগুলি ওজন করতে পারি, তাহলে আমরা আমাদের ফলাফলগুলি যথাযথভাবে মেলে এমন ফলাফলগুলির দ্বারা অর্ডার দিতে পারি।

এটি ভেক্টর স্পেস মডেলের ধারণা, এসকিউএল পূর্ণ-পাঠ্য অনুসন্ধান কিভাবে কাজ করে তা থেকে অনেক দূরে নয়:

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
)

তৈরি করা প্রচুর উন্নতি রয়েছে তবে মডেলটি প্রাকৃতিক প্রশ্নগুলির থেকে ভাল ফলাফল পাওয়ার একটি উপায় সরবরাহ করে, যার মধ্যে বুলিয়ান অপারেটর যেমন strstr() , preg_match() , strstr() বা stristr()

নোটা বেনি

ঐচ্ছিকভাবে শব্দ অনুসন্ধান করার আগে অলসতা নির্মূল

  • যার ফলে সূচক আকার হ্রাস এবং কম স্টোরেজ প্রয়োজন ফলে

  • কম ডিস্ক আমি / হে

  • দ্রুত সূচক এবং একটি ফলস্বরূপ দ্রুত অনুসন্ধান।

1. সাধারণকরণ

  • নিম্নতর ক্ষেত্রে সব লেখা রূপান্তর করুন

2. Stopword নির্মূল

  • কোনও মূল অর্থ বহন করে এমন পাঠ্য থেকে শব্দগুলি সরাও (যেমন 'এবং', 'বা', 'দী', 'জন্য' ইত্যাদি)

3. অভিধান প্রতিস্থাপন

  • অন্যের সাথে একই শব্দ বা অনুরূপ অর্থ আছে এমন শব্দগুলি প্রতিস্থাপন করুন। (উদাঃ 'ক্ষুধার্ত' এবং 'ক্ষুধার্ত' ক্ষুধার্ত উদাহরণগুলি প্রতিস্থাপন করুন)

  • আরও আলগোরিদিম ব্যবস্থা (স্নোবাল) তাদের অপরিহার্য অর্থ আরো শব্দ কমাতে সঞ্চালিত করা যেতে পারে।

  • তাদের হেক্সাডেসিমেল সমতুল্য সঙ্গে রঙের নাম প্রতিস্থাপন

  • স্পষ্টতা হ্রাস করে সংখ্যাসূচক মান হ্রাস পাঠ স্বাভাবিক করার অন্যান্য উপায়।

রিসোর্সেস


stripos() ব্যবহার করে কেস- stripos() মিলিং ব্যবহার করুন:

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

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

substr_count চেক ব্যবহার করে উত্তরগুলির substr_count ফলাফল যদি >0 । কিন্তু if বিবৃতিটি শূন্য হিসাবে শূন্য হিসাবে বিবেচিত হয় তবে আপনি সেই চেক এড়াতে এবং সরাসরি লিখতে পারেন:

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

উপস্থিত না হলে চেক করুন, যোগ করুন ! অপারেটর:

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

strstr() এবং stristr() ব্যবহার করে একটি স্ট্রিং থেকে শব্দটির ঘটনার সন্ধান করার আরেকটি বিকল্প নিম্নরূপ:

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

একটি স্ট্রিং নীচের ফাংশন সঙ্গে চেক করা যাবে:

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

Strpos ফাংশন জরিমানা কাজ করে, কিন্তু আপনি case-insensitiveঅনুচ্ছেদে একটি শব্দ চেক করতে চান তাহলে আপনি striposফাংশন ব্যবহার করতে পারেন PHP

উদাহরণ স্বরূপ,

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

একটি স্ট্রিং একটি কেস-অসংবেদক substring প্রথম ঘটনার অবস্থান খুঁজুন।

শব্দটি যদি স্ট্রিংয়ে বিদ্যমান না থাকে তবে এটি মিথ্যা ফিরিয়ে দেবে, এটি শব্দটির অবস্থানটি ফিরিয়ে দেবে।





string-matching