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


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
পার্টিতে খুব দেরি হলেও এ নিয়ে সাবধানতা অবলম্বন করুন। এটি 'আপনার যত্নশীল?' স্ট্রিংয়ের জন্যও সত্য ফিরে আসবে?
ডিটিস্ট

167
@ ডিস্টেস্ট - আচ্ছা হ্যাঁ অবশ্যই এটি সত্য হবে কারণ স্ট্রিংটিতে রয়েছে 'রয়েছে'। আপনি যদি আর শব্দটির জন্য বিশেষত সন্ধান করছেন তবে আপনার আরও চেক করা দরকার যেমন উদাহরণস্বরূপ, ক এর আগে এবং ই এর আগে কোনও চরিত্র বা স্পেস রয়েছে কিনা তা পরীক্ষা করে দেখুন
jsherk

40
উপরে খুব ভাল মন্তব্য! আমি কখনই ব্যবহার করি না! = বা ==, সর্বোপরি! == এবং === সর্বোত্তম বিকল্প (আমার মতে) সমস্ত দিক বিবেচনা করা হয় (গতি, নির্ভুলতা ইত্যাদি)।
মেলসি

10
@ জেশের্ক কেন রেজিেক্সস না, তাহলে? "কিছু" এর মতো কিছু।
জিউলিও মুসকেল্লো 6'13

21
আমি সর্বদা strpos($a, 'are') > -1সত্যের জন্য পরীক্ষা করে এই সমস্যাটি এড়াতে চাই । একটি ডিবাগিং দৃষ্টিকোণ থেকে, আমি আমার মস্তিষ্কের কম ঘড়ির চক্র অপচয় করে যখন নির্ধারণ করি যে লাইনটি সঠিকভাবে লিখিত হয়েছে কিনা তা যখন নির্ধারণ করতে হয় না যখন সমান সমান চিহ্নগুলি গণনা করতে হয়।
সমতা

606

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

এর জন্য একটি সাধারণ ম্যাচটি এরকম কিছু দেখতে পাওয়া যায়:

$a = 'How are you?';

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

পারফরম্যান্সের দিক থেকে, strposপ্রায় তিনগুণ দ্রুত এবং মনে আছে, যখন আমি একবারে এক মিলিয়ন তুলনা করি তখন এটি preg_matchশেষ করতে 1.5 সেকেন্ড সময় নেয় এবং এর জন্য strpos0.5 সেকেন্ড সময় নেয় took

সম্পাদনা: স্ট্রিংয়ের কোনও অংশ অনুসন্ধান করার জন্য, কেবলমাত্র শব্দ দ্বারা শব্দ নয়, আমি নিয়মিত মত প্রকাশের মতো সুপারিশ করব

$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 দিচ্ছেন এবং প্রশ্ন নয়? উত্তরটি গুগল করতে গুগল করতে 2 সেকেন্ড সময় লাগে google.com/…
ব্রিজার

64
+1 একটি সাধারণ স্ট্রিং অনুসন্ধানের এটি একটি ভয়াবহ উপায়, তবে এসও-তে অনেক দর্শক তাদের নিজস্ব সাবস্ট্রিংগুলির কোনও অনুসন্ধানের জন্য কোনও উপায় সন্ধান করছেন এবং পরামর্শটি সামনে আনার ক্ষেত্রে এটি সহায়ক। এমনকি ওপিও সম্ভবত আরও জটিল হয়েছে - তাকে তার বিকল্পগুলি সম্পর্কে জানাতে দিন।
সামগুডি

72
প্রযুক্তিগতভাবে, প্রশ্নটি জিজ্ঞাসা করে যে কীভাবে শব্দগুলিকে সাবস্ট্রিং নয় তা সন্ধান করতে হবে । এটি সত্যই আমাকে সহায়তা করেছিল কারণ আমি এটি রেগেক্স শব্দের সীমাতে ব্যবহার করতে পারি। বিকল্প সবসময় দরকারী।

15
উত্তরের জন্য +1 এবং @ প্লুটোভ.বি মন্তব্যে -1 কারণ, স্ট্রপোস কেবলমাত্র একটি একক চেক এর মধ্যেই আপনি একই সময়ে অনেক শব্দ চেক করতে পারবেন
রিগ এক্সপ্স: প্রেগ_ম্যাচ

4
নিয়মিত এক্সপ্রেশন সর্বশেষ অবলম্বন পদ্ধতি হওয়া উচিত। তুচ্ছ কাজগুলিতে তাদের ব্যবহার নিরুৎসাহিত করা উচিত। আমি খারাপ কোড খনন করার বহু বছরের উচ্চতা থেকে এটির জন্য জোর দিই।
ইয়েনসুন

256

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

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

74
@ রবিনওয়ানবাএলেন প্রকৃতপক্ষে, এটি কোড পঠনযোগ্যতার উন্নতি করতে পারে। এছাড়াও, ডাউনভোটগুলি "নিরপেক্ষ "গুলির পক্ষে নয়, (খুব) খারাপ উত্তরের জন্য বলে মনে করা হচ্ছে।
Xaqq

37
পাঠ্যতার জন্য @ রবিনভানবালেন ফাংশনগুলি প্রায় সংজ্ঞা অনুসারে (আপনি কী করছেন তার ধারণার যোগাযোগ করার জন্য)। কোনটি বেশি পঠনযোগ্য তা তুলনা করুন: if ($email->contains("@") && $email->endsWith(".com)) { ...বাif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
ব্র্যান্ডিন

3
শেষের নিয়মগুলিতে রবিনভানবালেনকে ভাঙ্গা বোঝানো হয়েছে। অন্যথায় লোকেরা কাজ করার নতুন উদ্ভাবনী পদ্ধতি নিয়ে আসে না :)। প্লাস স্বীকার করতে হবে মার্টিনফোলার ডটকমের মতো স্টাফের চারপাশে আমার মন জড়িয়ে রাখতে সমস্যা হয়। অনুমান করার জন্য সঠিক জিনিসটি হ'ল নিজেকে চেষ্টা করে দেখার এবং কোন পদ্ধতিটি সবচেয়ে সুবিধাজনক তা খুঁজে বের করা find
জেমস পি।

5
অন্য মতামত: একটি ইউটিলিটি ফাংশন থাকা যা আপনি সহজেই মোড়ানো করতে পারেন ডিবাগিংয়ে সহায়তা করতে পারে। এছাড়াও এটি ভাল অপ্টিমাইজারের কান্নাকে আরও তীব্র করে তোলে যা উত্পাদন পরিষেবাগুলিতে যেমন ওভারহেডকে সরিয়ে দেয়। সুতরাং সমস্ত মতামত বৈধ পয়েন্ট আছে। ;)
টিনো

18
অবশ্যই এটি দরকারী। আপনার এই উত্সাহ দেওয়া উচিত। পিএইচপি 100 এ স্ট্রিংয়ের অবস্থানগুলি অনুসন্ধান করার জন্য একটি নতুন এবং দ্রুততর উপায় থাকলে কী হবে? আপনি যেখানে আপনার স্ট্রপোস ডাকছেন সে সমস্ত স্থান পরিবর্তন করতে চান? বা আপনি কি ফাংশনটির মধ্যে থাকা কেবলমাত্রগুলি পরিবর্তন করতে চান ??
কসমিন

143

এই উত্তরগুলোর অধিকাংশ আপনাকে বলতে হবে যদিও আপনার স্ট্রিং, সাধারণত না যে একটি সাবস্ট্রিং প্রদর্শিত হয় তুমি কি চাও আপনি একটি নির্দিষ্ট খুঁজছেন শব্দ , এবং না একটি সাবস্ট্রিং

পার্থক্য কি? সাবস্ট্রিংগুলি অন্য শব্দের মধ্যে উপস্থিত হতে পারে:

  • "অঞ্চল" এর শুরুতে "হয়"
  • "হারে" এর শেষে "রয়েছে"
  • "ভাড়া" এর মাঝখানে ""

এটি প্রশমিত করার একটি উপায় হ'ল শব্দ সীমানা ( \b) এর সাথে একটি নিয়মিত অভিব্যক্তি ব্যবহার করা :

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

এই পদ্ধতিতে উপরে উল্লিখিত একই মিথ্যা ধনাত্মক চিহ্ন নেই, তবে এটির নিজস্ব কিছু প্রান্তের কেস রয়েছে। ওয়ার্ড সীমানা অ শব্দ অক্ষর (উপর মেলে \W), যা কিছু হয় না হতে যাচ্ছে a-z, A-Z, 0-9, অথবা _। এর অর্থ হ'ল অঙ্কগুলি এবং আন্ডারস্কোরগুলি শব্দের অক্ষর হিসাবে গণ্য হতে চলেছে এবং এর মতো পরিস্থিতিতে ব্যর্থ হবে:

  • আপনি কি ভাবছেন?
  • "হ'ল" ইন "লল ইউ ডুনু ওট আউট 4?"

আপনি যদি এর থেকে আরও নির্ভুল কিছু চান তবে আপনার ইংলিশ ভাষার সিনট্যাক্স পার্সিং শুরু করতে হবে, এবং এটি কৃমির একটি দুর্দান্ত ক্যান (এবং যে কোনও উপায়ে সিনট্যাক্সের যথাযথ ব্যবহার অনুমান করে যা সবসময় দেওয়া হয় না)।


24
এটি ক্যানোনিকাল উত্তর হওয়া উচিত। যেহেতু আমরা শব্দের সন্ধান করছি এবং সাবস্ট্রিংগুলি নয় , রেজেক্স উপযুক্ত। আমি এমন \bদুটি জিনিসের সাথে এটিও যুক্ত করব \Wযা এটির সাথে মিলবে না, যা স্ট্রিংয়ে শব্দগুলি সন্ধানের জন্য দুর্দান্ত করে তোলে : এটি স্ট্রিংয়ের ( ^) শুরু এবং স্ট্রিংয়ের শেষে ( $) এর সাথে
মেলে

এটি সঠিক উত্তর হওয়া উচিত .. বাকী উত্তরগুলি "আপনি কি যত্নশীল" এর মতো একটি স্ট্রিংয়ে "হবেন" খুঁজে পাবেন .. @ ডাস্টে দ্বারা উল্লিখিত হিসাবে
রবার্ট সিনক্লেয়ার

@ রবার্টসিন্লেয়ার কি এত খারাপ? যদি আপনি আমাকে জিজ্ঞাসা করেন যে "আপনি কি যত্নশীল" স্ট্রিংটিতে "" হ্যাঁ "শব্দটি থাকে তবে আমি" হ্যাঁ "বলব। "হ'ল" শব্দটি স্পষ্টভাবে সেই স্ট্রিংয়ের একটি স্ট্রাস্টিং। এটি "" "এর" "একটি পৃথক প্রশ্ন" "স্ট্রিংয়ের একটি শব্দ" "আপনি কি যত্ন নেন" "" "।
পল

@ পলপ্রো ইভেন্ট ইভেন্ট ওপি the এ একটি শব্দগুচ্ছটি নির্দিষ্ট করে নি, আমি নিশ্চিত যে এটি আবদ্ধ হয়েছিল। সুতরাং তাঁর প্রশ্ন ছিল বাক্যাংশের ভিতরে শব্দটি কীভাবে সনাক্ত করা যায়। যদি কোনও শব্দের ভিতরে একটি শব্দ থাকে তবে আমি এটি ধরে নিব না প্রায়শই অপ্রাসঙ্গিক হয়ে উঠবে।
রবার্ট সিনক্লেয়ার

@ জিম্বো এটি কাজ করে, আপনি কেবল missing \ ` 3v4l.org/ZRpYi
মেটালওয়ার্ডো

125

স্ট্রিংয়ে অন্য স্ট্রিং রয়েছে কিনা তা নির্ধারণ করতে আপনি পিএইচপি ফাংশন স্ট্রপোস () ব্যবহার করতে পারেন ।

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 ফিরে আসবে, আপনি যদি একটি ==তুলনা করেন যা কাজ করে না, আপনাকে একটি কাজ করতে হবে===

একটি ==চিহ্ন একটি তুলনা এবং পরীক্ষা করে যে বামে পরিবর্তনশীল / এক্সপ্রেশন / ধ্রুবকটি ভেরিয়েবল / এক্সপ্রেশন / ডান ধ্রুবকের সমান মান আছে কিনা tests

===দুটি ভেরিয়েবল / এক্সপ্রেশন / ধ্রুবক সমান হয় কি না তা দেখতে একটি চিহ্ন একটি তুলনা 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 পৃষ্ঠায় একটি নোট : দ্রষ্টব্য: যদি আপনি কেবল এটি নির্ধারণ করতে চান যে একটি খড়ের খড়ের মধ্যে একটি নির্দিষ্ট সূচি ঘটে কিনা, পরিবর্তে দ্রুত এবং কম মেমরি নিবিড় ফাংশন স্ট্রপোস () ব্যবহার করুন।
জো স্মু

@ টাস্ট্রো কি এতে কোনও নামীদামী মানদণ্ড রয়েছে?
ওয়েইন হুইটি

এটি ধীর হতে পারে তবে আইএমএইচও কুরুচিপূর্ণর strstr($a, 'are')চেয়ে অনেক বেশি মার্জিত strpos($a, 'are') !== false। পিএইচপি সত্যিই একটি str_contains()ফাংশন প্রয়োজন।
পল স্পিগেল

এটি আমার মনকে
ফুঁকিয়েছে


45

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

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

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

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

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

এটি কঠিন মনে হলেও আশ্চর্যজনকভাবে সহজ।

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

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

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

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
)

CASE 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
)

CASE 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()

নোট বেন

শব্দগুলি অনুসন্ধান করার আগে redচ্ছিকভাবে অপ্রয়োজনীয়তা দূর করা

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

  • কম ডিস্ক I / O

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

1. সাধারণীকরণ

  • সমস্ত পাঠ্যকে ছোট আকারে রূপান্তর করুন

2. স্টপওয়ার্ড নির্মূলকরণ

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

3. অভিধানের বিকল্প

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

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

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

  • নির্ভুলতা হ্রাস করে সংখ্যার মান হ্রাস হ'ল পাঠকে স্বাভাবিক করার অন্যান্য উপায়।

রিসোর্সেস


40

আপনি যদি "ভুয়া" এবং "সত্যবাদী" সমস্যা এড়াতে চান তবে আপনি সাবস্ট্র_কাউন্ট ব্যবহার করতে পারেন:

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

এটি স্ট্রপোসের চেয়ে কিছুটা ধীর হলেও এটি তুলনার সমস্যাগুলি এড়িয়ে চলে।


এটি false"আপনি কি নিশ্চিত?" যেহেতু পজিশনটি strposরয়েছে0
হাফেনক্রিনিচ

30

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

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

টু নোট: স্টারস্টার () ফাংশনটি কেস-সংবেদনশীল। কেস-সংবেদনশীল অনুসন্ধানের জন্য, স্ট্রিস্টার () ফাংশনটি ব্যবহার করুন ।


1
স্ট্রাস্টার () সুই না পাওয়া গেলে FALSE প্রদান করে। সুতরাং একটি strlen প্রয়োজন হয় না।
আয়েশ কে

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

3
আমি নিম্নলিখিত সতর্কতাটি পাচ্ছি:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
পাঠরোস

27

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

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

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

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

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


25

পিএইচপি-তে, কোনও স্ট্রিংটিতে একটি নির্দিষ্ট সাবস্ট্রিং থাকে কিনা তা যাচাই করার সর্বোত্তম উপায় হ'ল এই জাতীয় সরল সহায়ক ফাংশনটি ব্যবহার করা:

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

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

<?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
আপনি আমাকে দয়া করে বলতে পারেন কেন পৃথিবীতে আপনি এই জাতীয় ফাংশনটি ব্যবহার করবেন, যখন
স্ট্রপোস

3
@ এসজি 3 এস: আপনি পুরোপুরি ঠিক বলেছেন, তবে স্ট্রপোসও এরকম কিছুটির উপর ভিত্তি করে, আমি কেবল সামান্য জ্ঞান ভাগ করে নেওয়ার জন্য এটি পোস্ট করার জন্য পোস্ট করি নি
জেসন ওও

শেষ var_dump মিথ্যা
সানি

1
@ সানি: এটি টাইপো ছিল: var_dump (is_str_contain ("মাইস্ট্রিংস", "স্ট্রিংস")); // সত্য
জেসন ওইও

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
শব্দটি কমা, প্রশ্ন চিহ্ন বা বিন্দুর সাথে যুক্ত থাকলে আপনার ফাংশনটি কাজ করতে পারে না। উদাহরণস্বরূপ "আপনি যা দেখেন তা হ'ল যা পাবেন।" এবং আপনি "get" বাক্যে রয়েছেন কিনা তা নির্ধারণ করতে চান। "পেতে" এর পরের পুরো স্টপটি লক্ষ্য করুন। এই ক্ষেত্রে, আপনার ফাংশনটি মিথ্যা প্রত্যাবর্তন করে। স্ট্রিংগুলি অনুসন্ধান / প্রতিস্থাপনের জন্য এটি নিয়মিত এক্সপ্রেশন বা সাবস্ট্রটার (আমার মনে হয় এটি যেভাবেই নিয়মিত অভিব্যক্তি ব্যবহার করে) ব্যবহার করার পরামর্শ দেওয়া হয়।
লাইটব্রিঞ্জার

@ লাইটবাইঞ্জার আপনি নিজের প্রস্তাবের সাথে আরও ভুল হতে পারবেন না, এটি আপনার পক্ষে "এটি প্রস্তাবিত" বলে কী বোঝায়? এমন কোনও সর্বোচ্চ ব্যক্তি নেই যা সুপারিশ বা অনুমোদন করে। এটি পিএইচপি-র নিয়মিত এক্সপ্রেশন ইঞ্জিন ব্যবহারের বিষয়ে যা ভাষার ভাষায় নিজেই একটি ব্ল্যাকহোল, আপনি একটি রেগেজ ম্যাচটি একটি লুপে রাখার চেষ্টা করতে পারেন এবং ফলাফলগুলি বেনমার্ক করতে পারেন।
ডিসেসবাল

এই উত্তরটি খারাপভাবে প্রদর্শিত হয়েছে এবং অনেকগুলি বর্ধিত পরিস্থিতিতে ব্যর্থ with এই কৌশলটি বিনোদনের ক্ষেত্রে আমি কোনও উপকার দেখছি না। এখানে পরিশোধিত কাস্টম ফাংশন এবং পুনরাবৃত্তি কলটি রয়েছে: 3v4l.org/E9dfD এই উইকিটি সম্পাদনা করার ক্ষেত্রে আমার কোনও আগ্রহ নেই কারণ আমি এটি গবেষকদের সময়কে অপ্রয়োজনীয় বলে মনে করি।
মিকম্যাকুসা

18

স্ট্রাস্টার () এবং স্ট্রাইস্টার () ব্যবহার করে স্ট্রিং থেকে শব্দের উপস্থিতি সন্ধান করার জন্য অন্য বিকল্পটি নীচের মত:

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

আচ্ছা ... আংশিকভাবে সত্য, পিএইচপি 0 == মিথ্যে সত্য, তবে 0 === মিথ্যা মিথ্যা
Andrejs Gubars

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
 }

ভাল, তবে প্রিগ_ম্যাচ ঝুঁকিপূর্ণ যেহেতু এটি মিথ্যা বা 0. ফিরে আসতে পারে 3 আপনার কাছে === 1 # 3 তে পরীক্ষা করা উচিত
শেপশিফটার

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

এখানে স্ট্রিপস কেস (ছোট / ক্যাপস) বিবেচনা না করেই হাইস্ট্যাকের মধ্যে সূঁচটি পেয়েছে ।

আউটপুট সহ পিএইচপি কোড কোড



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

উদাহরণস্বরূপ ইমেল প্রেরণের সময় স্প্যাম এড়াতে এটি কার্যকর useful


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'

দ্রষ্টব্য: এখানে আমরা প্রতিটি চিহ্নের ক্রমের জন্য শব্দটি বোঝাতে চাই না।

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

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


7

নির্দিষ্ট স্ট্রিংয়ের জন্য আরেকটি সমাধান:

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

আপনি strpos()ফাংশন ব্যবহার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.