Bagaimana cara saya memeriksa apakah suatu string berisi kata tertentu?

2661

Mempertimbangkan:

$a = 'How are you?';

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

Misalkan saya memiliki kode di atas, apa cara yang benar untuk menulis pernyataan if ($a contains 'are')?

Charles Yeung
sumber

Jawaban:

6894

Anda dapat menggunakan strpos()fungsi yang digunakan untuk menemukan kemunculan satu string di dalam yang lain:

$a = 'How are you?';

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

Perhatikan bahwa penggunaan !== falsedisengaja (tidak != falsejuga tidak === trueakan mengembalikan hasil yang diinginkan); strpos()mengembalikan offset di mana string jarum dimulai di string tumpukan jerami, atau boolean falsejika jarum tidak ditemukan. Karena 0 adalah offset yang valid dan 0 adalah "falsey", kami tidak dapat menggunakan konstruksi yang lebih sederhana seperti !strpos($a, 'are').

codaddict
sumber
261
Sangat terlambat ke pesta, tapi hati-hati dengan ini. Ini juga akan mengembalikan true untuk string 'Apakah kamu peduli?'
DTest
167
@Dest - yah tentu saja itu akan mengembalikan true karena string berisi 'are'. Jika Anda mencari kata ADA secara khusus maka Anda perlu melakukan lebih banyak pemeriksaan seperti, misalnya, memeriksa apakah ada karakter atau spasi sebelum huruf A dan setelah
huruf
40
Komentar yang sangat bagus di atas! Saya tidak pernah menggunakan! = Atau ==, setelah semua! == dan === adalah pilihan terbaik (menurut saya) semua aspek dipertimbangkan (kecepatan, ketepatan dll).
Melsi
10
@ jsherk Kalau begitu, kenapa tidak regex? Sesuatu seperti "adalah".
Giulio Muscarello
22
Saya cenderung menghindari masalah ini dengan selalu menggunakan strpos($a, 'are') > -1untuk menguji kebenaran. Dari perspektif debugging, saya menemukan otak saya buang lebih sedikit siklus clock menentukan apakah garis ditulis dengan benar ketika saya tidak harus menghitung tanda sama dengan yang berdekatan.
equazcion
608

Anda dapat menggunakan ekspresi reguler, lebih baik untuk pencocokan kata dibandingkan dengan yang strposdisebutkan oleh pengguna lain, itu juga akan mengembalikan true untuk string seperti tarif, perawatan, tatapan, dll. Ini hanya dapat dihindari dalam ekspresi reguler dengan menggunakan batas kata.

Pasangan yang cocok untuk dapat terlihat seperti ini:

$a = 'How are you?';

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

Di sisi kinerja, strpossekitar tiga kali lebih cepat dan ada dalam pikiran, ketika saya melakukan satu juta membandingkan sekaligus, butuh preg_match1,5 detik untuk menyelesaikan dan untuk strpositu butuh 0,5 detik.

Sunting: Untuk mencari bagian mana pun dari string, bukan hanya kata demi kata, saya akan merekomendasikan menggunakan ungkapan biasa seperti

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

Pada iakhir ekspresi reguler mengubah ekspresi reguler menjadi tidak peka huruf besar-kecil, jika Anda tidak menginginkannya, Anda dapat mengabaikannya.

Sekarang, ini bisa sangat bermasalah dalam beberapa kasus karena $ string pencarian tidak dibersihkan dengan cara apa pun, maksud saya, mungkin tidak lulus pemeriksaan dalam beberapa kasus seolah-olah $searchinput pengguna mereka dapat menambahkan beberapa string yang mungkin berperilaku seperti beberapa ekspresi reguler yang berbeda ...

Juga, inilah alat yang hebat untuk menguji dan melihat penjelasan berbagai ekspresi reguler Regex101

Untuk menggabungkan kedua set fungsionalitas menjadi fungsi multi-fungsi tunggal (termasuk dengan sensitivitas case yang dapat dipilih), Anda dapat menggunakan sesuatu seperti ini:

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.
}
Breezer
sumber
9
@ Alexander.Plutov kedua-tama Anda memberi saya -1 dan bukan pertanyaannya? cmon dibutuhkan 2 detik untuk google jawabannya google.com/...
Breezer
64
+1 Ini adalah cara yang mengerikan untuk mencari string sederhana, tetapi banyak pengunjung SO mencari cara apa pun untuk mencari substring mereka sendiri, dan akan sangat membantu jika saran tersebut muncul. Bahkan OP mungkin terlalu disederhanakan - biarkan dia tahu alternatifnya.
SamGoody
72
Secara teknis, pertanyaannya adalah bagaimana menemukan kata - kata bukan substring. Ini sebenarnya membantu saya karena saya bisa menggunakan ini dengan batas kata regex. Alternatif selalu bermanfaat.
15
+1 untuk jawaban dan -1 ke komentar @ plutov.by karena, strpos hanya satu pemeriksaan sementara regexp Anda dapat memeriksa banyak kata dalam waktu yang sama, misalnya: preg_match (/ are | you | not /)
albanx
4
Ekspresi Reguler harus menjadi metode resor terakhir. Penggunaannya dalam tugas-tugas sepele harus dicegah. Saya bersikeras ini dari ketinggian bertahun-tahun menggali kode buruk.
yentsun
257

Berikut adalah sedikit fungsi utilitas yang berguna dalam situasi seperti ini

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
    return strpos($haystack, $needle) !== false;
}
ejunker
sumber
74
@RobinvanBaalen Sebenarnya, ini dapat meningkatkan keterbacaan kode. Juga, downvotes seharusnya untuk jawaban yang sangat buruk, bukan untuk jawaban yang "netral".
Xaqq
37
Fungsi @RobinvanBaalen hampir secara definisi dapat dibaca (untuk mengkomunikasikan gagasan tentang apa yang Anda lakukan). Bandingkan mana yang lebih mudah dibaca: if ($email->contains("@") && $email->endsWith(".com)) { ...atauif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Brandin
3
@RobinvanBaalen pada aturan akhirnya dimaksudkan untuk dilanggar. Kalau tidak, orang tidak akan menemukan cara inventif baru dalam melakukan sesuatu :). Plus harus mengakui bahwa saya mengalami kesulitan membungkus pikiran sekitar hal-hal seperti di martinfowler.com. Tebak hal yang benar untuk dilakukan adalah mencoba sendiri dan mencari tahu pendekatan apa yang paling nyaman.
James P.
5
Pendapat lain: Memiliki fungsi utilitas yang dapat Anda bungkus dengan mudah dapat membantu debugging. Ini juga membuat para pengoptimal yang baik perlu mengurangi biaya overhead dalam layanan produksi. Jadi semua pendapat memiliki poin yang valid. ;)
Tino
18
Tentu ini bermanfaat. Anda harus mendorong ini. Apa yang terjadi jika di PHP 100 ada cara baru dan lebih cepat untuk menemukan lokasi string? Apakah Anda ingin mengubah semua tempat Anda di mana Anda menelepon sambil berdiri? Atau Anda ingin mengubah hanya berisi dalam fungsi ??
Cosmin
143

Meskipun sebagian besar jawaban ini akan memberi tahu Anda jika substring muncul di string Anda, biasanya itu bukan yang Anda inginkan jika Anda mencari kata tertentu , dan bukan substring .

Apa bedanya? Substring dapat muncul dengan kata lain:

  • The "are" pada awal "area"
  • "Adalah" pada akhir "kelinci"
  • "Adalah" di tengah "tarif"

Salah satu cara untuk mengurangi ini adalah dengan menggunakan ekspresi reguler ditambah dengan batas kata ( \b):

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

Metode ini tidak memiliki positif palsu yang sama dengan yang disebutkan di atas, tetapi metode ini memiliki beberapa kasus tepi sendiri. Batas kata cocok pada karakter non-kata ( \W), yang akan menjadi sesuatu yang tidak a-z, A-Z, 0-9, atau _. Itu berarti digit dan garis bawah akan dihitung sebagai karakter kata dan skenario seperti ini akan gagal:

  • "Apakah" dalam "Apa yang Anda pikirkan?"
  • "Ada" di "lol u tidak tahu, tapi itu 4?"

Jika Anda menginginkan sesuatu yang lebih akurat dari ini, Anda harus mulai melakukan parsing sintaksis bahasa Inggris, dan itu adalah sekaleng cacing yang cukup besar (dan mengasumsikan penggunaan sintaks yang tepat, yang tidak selalu diberikan).

FtDRbwLXw6
sumber
24
ini harus menjadi jawaban kanonik. Karena kami mencari kata - kata dan bukan substring , regex sesuai. Saya juga akan menambahkan yang \bcocok dengan dua hal yang \Wtidak, yang membuatnya bagus untuk menemukan kata-kata dalam string: Itu cocok dengan awal string ( ^) dan akhir string ( $)
code_monk
ini harus jawaban yang benar .. sisa jawaban akan menemukan "berada" dalam string seperti "apakah kamu peduli" .. Seperti yang disebutkan oleh @Dtest
Robert Sinclair
@RobertSinclair Apakah itu sangat buruk? Jika Anda bertanya kepada saya apakah string "Anda peduli" berisi kata "adalah" Saya akan mengatakan "ya". Kata "are" jelas merupakan substring dari string itu. Itu pertanyaan terpisah dari "" "Apakah" adalah "salah satu kata dalam string" apakah Anda peduli "" "".
Paul
@Paulpro Meskipun OP tidak menentukan $ a adalah frase, saya cukup yakin itu tersirat. Jadi pertanyaannya adalah bagaimana mendeteksi Firman di dalam Frasa. Tidak jika suatu kata mengandung kata di dalamnya, yang saya anggap tidak relevan lebih sering daripada tidak.
Robert Sinclair
@Jimbo itu berfungsi, Anda hanya melewatkan `\` 3v4l.org/ZRpYi
MetalWeirdo
125

Untuk menentukan apakah string berisi string lain, Anda dapat menggunakan fungsi 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";
}

?>

PERINGATAN:

Jika jarum yang Anda cari ada di awal tumpukan jerami, ia akan kembali ke posisi 0, jika Anda melakukan ==perbandingan yang tidak berfungsi, Anda harus melakukan===

Sebuah ==tanda adalah perbandingan dan tes apakah variabel / ekspresi / konstan ke kiri memiliki nilai yang sama sebagai variabel / ekspresi / konstan ke kanan.

Sebuah ===tanda adalah perbandingan untuk melihat apakah dua variabel / expresions / konstanta yang sama ANDmemiliki tipe yang sama - yaitu keduanya string atau keduanya adalah bilangan bulat.

Jose Vega
sumber
67

Lihatlahstrpos() :

<?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.";
    }
?>
Haim Evgi
sumber
62

Menggunakan strstr()atau stristr()jika pencarian Anda harus case-sensitive akan menjadi pilihan lain.

glutorange
sumber
9
Catatan di halaman php.net/manual/en/function.strstr.php : Catatan: Jika Anda hanya ingin menentukan apakah suatu jarum tertentu muncul di dalam tumpukan jerami, gunakan fungsi yang lebih cepat dan lebih sedikit memori strpos ().
Jo Smo
@tastro Apakah ada tolok ukur yang dapat dipercaya tentang hal ini?
Wayne Whitty
Ini mungkin lebih lambat, tapi IMHO strstr($a, 'are')jauh lebih elegan daripada yang jelek strpos($a, 'are') !== false. PHP sangat membutuhkan str_contains()fungsi.
Paul Spiegel
Saya
terkejut
45

Manfaatkan pencocokan case-insensitve menggunakan stripos():

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

Mengintip komentar SamGoody dan Lego Stormtroopr.

Jika Anda mencari algoritma PHP untuk menentukan peringkat hasil pencarian berdasarkan kedekatan / relevansi beberapa kata, inilah cara cepat dan mudah untuk menghasilkan hasil pencarian hanya dengan PHP:

Masalah dengan metode pencarian boolean lain seperti strpos(), preg_match(), strstr()ataustristr()

  1. tidak dapat mencari beberapa kata
  2. hasilnya tidak disimpan

Metode PHP berdasarkan Vector Space Model dan tf-idf (istilah frekuensi - frekuensi dokumen terbalik):

Kedengarannya sulit tetapi sangat mudah.

Jika kita ingin mencari beberapa kata dalam sebuah string, masalah intinya adalah bagaimana kita memberikan bobot pada masing-masing kata?

Jika kami dapat menimbang istilah dalam string berdasarkan seberapa representatifnya dari string secara keseluruhan, kami dapat memesan hasil kami dengan yang paling cocok dengan kueri.

Ini adalah gagasan model ruang vektor, tidak jauh dari cara kerja pencarian teks lengkap 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;
}

KASUS 1

$query = 'are';

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

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

HASIL

Array
(
    [1] => 0.52832083357372
)

KASUS 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>';

HASIL

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

KASUS 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>';

HASIL

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

Ada banyak perbaikan yang harus dilakukan tetapi model tersebut menyediakan cara untuk mendapatkan hasil yang baik dari permintaan alami, yang tidak memiliki operator boolean seperti strpos(), preg_match(), strstr()atau stristr().

NOTA BENE

Opsional menghilangkan redundansi sebelum mencari kata-kata

  • dengan demikian mengurangi ukuran indeks dan menghasilkan kebutuhan penyimpanan yang lebih sedikit

  • lebih sedikit disk I / O

  • pengindeksan lebih cepat dan pencarian yang lebih cepat akibatnya.

1. Normalisasi

  • Ubah semua teks menjadi huruf kecil

2. Penghapusan stopword

  • Hilangkan kata-kata dari teks yang tidak memiliki makna nyata (seperti 'dan', 'atau', 'the', 'untuk', dll.)

3. Substitusi kamus

  • Ganti kata dengan yang lain yang memiliki arti identik atau serupa. (mis: ganti contoh 'lapar' dan 'lapar' dengan 'lapar')

  • Langkah-langkah algoritmik lebih lanjut (bola salju) dapat dilakukan untuk lebih mengurangi kata-kata menjadi arti penting mereka.

  • Penggantian nama warna dengan padanan heksadesimalnya

  • Pengurangan nilai numerik dengan mengurangi presisi adalah cara lain untuk menormalkan teks.

SUMBER DAYA

RafaSashi
sumber
40

Jika Anda ingin menghindari masalah "falsey" dan "truthy", Anda dapat menggunakan substr_count:

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

Ini sedikit lebih lambat daripada tegar tetapi menghindari masalah perbandingan.

Alan Piralla
sumber
Itu kembali falseuntuk "apakah Anda yakin?" karena posisi strposadalah0
Hafenkranich
30

Pilihan lain adalah menggunakan fungsi strstr () . Sesuatu seperti:

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

Poin yang perlu diperhatikan: Fungsi strstr () peka huruf besar-kecil. Untuk pencarian case-insensitive, gunakan fungsi stristr () .

YashG99
sumber
1
strstr () mengembalikan FALSE jika jarum tidak ditemukan. Jadi tidak perlu strlen.
Ayesh K
29
if (preg_match('/(are)/', $a)) {
   echo 'true';
}
joan16v
sumber
3
Saya mendapatkan peringatan berikut:WARNING preg_match(): Delimiter must not be alphanumeric or backslash
Pathros
27

Saya agak terkesan bahwa tidak ada jawaban di sini yang digunakan strpos, strstrdan fungsi yang serupa disebutkan Multibyte String Functions yet (2015-05-08).

Pada dasarnya, jika Anda kesulitan menemukan kata-kata dengan karakter khusus untuk beberapa bahasa , seperti Jerman, Prancis, Portugis, Spanyol, dll. (Mis: ä , é , ô , ç , º , º , ñ ), Anda mungkin ingin mengawali fungsi dengan mb_. Oleh karena itu, jawaban yang diterima akan menggunakan mb_strposatau mb_stripos(untuk pencocokan case-sensitive) sebagai gantinya:

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

Jika Anda tidak dapat menjamin bahwa semua data Anda 100% di UTF-8 , Anda mungkin ingin menggunakan mb_fungsinya.

Sebuah artikel yang bagus untuk memahami mengapa Minimum Yang Mutlak Setiap Pengembang Perangkat Lunak, Pasti Harus Tahu Tentang Unicode dan Karakter Set (Tanpa Alasan!) Oleh Joel Spolsky .

Lengan
sumber
25

Di PHP, cara terbaik untuk memverifikasi apakah string berisi substring tertentu, adalah dengan menggunakan fungsi pembantu sederhana seperti ini:

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

Penjelasan:

  • strpos menemukan posisi kemunculan pertama dari substring peka huruf besar-kecil dalam sebuah string.
  • stripos menemukan posisi kemunculan pertama substring yang tidak peka huruf besar-kecil dalam sebuah string.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUEmemastikan bahwa myFunctionselalu mengembalikan boolean dan memperbaiki perilaku tak terduga ketika indeks substring adalah 0.
  • $caseSensitive ? A : Bmemilih salah satu strposatau striposmelakukan pekerjaan, tergantung pada nilai $caseSensitive.

Keluaran:

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)
John Slegers
sumber
22

Fungsi di bawah ini juga berfungsi dan tidak bergantung pada fungsi lainnya; hanya menggunakan manipulasi string PHP asli. Secara pribadi, saya tidak merekomendasikan ini, tetapi Anda dapat melihat cara kerjanya:

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

Uji:

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 
Jason OOO
sumber
13
Bisakah Anda memberi tahu saya mengapa di dunia Anda akan menggunakan fungsi seperti ini, ketika strpos adalah solusi yang sangat layak? ...
sg3s
3
@ sg3s: Anda sepenuhnya benar, namun, juga didasarkan pada sesuatu seperti itu, juga, saya tidak mempostingnya untuk perwakilan hanya karena berbagi sedikit pengetahuan
Jason OOO
var_dump terakhir salah
Cerah
1
@ Sunny: itu salah ketik: var_dump (is_str_contain ("mystringss", "string")); // benar
Jason OOO
22

Anda dapat menggunakan strstrfungsi ini:

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

if ($flag){

    echo "true";
}

Tanpa menggunakan fungsi bawaan:

$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 ";
}
Arshid KV
sumber
2
Hancur jika Anda mencari kata pertama.
T30
20

Saya mengalami masalah dengan ini, dan akhirnya saya memilih untuk membuat solusi sendiri. Tanpa menggunakan mesin ekspresi reguler :

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

Anda mungkin memperhatikan bahwa solusi sebelumnya bukan jawaban untuk kata yang digunakan sebagai awalan untuk yang lain. Untuk menggunakan contoh Anda:

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

Dengan sampel di atas, keduanya $adan $bberisi $c, tetapi Anda mungkin ingin fungsi Anda memberi tahu Anda bahwa hanya $aberisi $c.

Decebal
sumber
1
Anda mungkin berarti: $found = falsedi awal
slownage
1
fungsi Anda mungkin tidak berfungsi jika kata tersebut dikaitkan dengan koma, tanda tanya atau titik. misalnya "apa yang Anda lihat adalah apa yang Anda dapatkan." dan Anda ingin menentukan apakah "dapatkan" dalam kalimat. Perhatikan pemberhentian penuh di sebelah "dapatkan". Dalam hal ini, fungsi Anda mengembalikan false. disarankan untuk menggunakan ekspresi reguler atau substr (saya pikir tetap menggunakan ekspresi reguler) untuk mencari / mengganti string.
lightbringer
@lightbringer Anda tidak bisa salah dengan rekomendasi Anda, apa artinya bagi Anda "dianjurkan"? tidak ada orang tertinggi yang merekomendasikan atau menyetujui. Ini tentang penggunaan mesin ekspresi reguler di php yang merupakan lubang hitam dalam bahasa itu sendiri, Anda mungkin ingin mencoba menempatkan kecocokan regex dalam satu lingkaran dan membandingkan hasilnya.
Decebal
Jawaban ini tidak ditunjukkan dengan baik dan gagal dengan banyak skenario. Saya tidak melihat manfaat dalam menghibur teknik ini. Berikut adalah fungsi kustom yang disempurnakan dan panggilan iterated: 3v4l.org/E9dfD Saya tidak tertarik mengedit wiki ini karena saya merasa pemborosan waktu peneliti.
mickmackusa
18

Pilihan lain untuk menemukan kemunculan kata dari string menggunakan strstr () dan stristr () adalah seperti berikut:

<?php
    $a = 'How are you?';
    if (strstr($a,'are'))  // Case sensitive
        echo 'true';
    if (stristr($a,'are'))  // Case insensitive
        echo 'true';
?>
Sadikhasan
sumber
Ini mundur. The iin stristradalah singkatan dari tidak sensitif.
Adam Merrifield
18

Banyak jawaban yang menggunakan substr_countpemeriksaan jika hasilnya >0. Tetapi karena ifpernyataan tersebut menganggap nol sama dengan false , Anda dapat menghindari cek itu dan menulis langsung:

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

Untuk memeriksa apakah tidak ada, tambahkan !operator:

if (!substr_count($a, 'are')) {
T30
sumber
Ya ... sebagian benar, di php 0 == false benar, tapi 0 === false salah
Andrejs Gubars
17

Ini dapat dilakukan dengan tiga cara berbeda:

 $a = 'How are you?';

1- stristr ()

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

2- strpos ()

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

3- preg_match ()

 if( preg_match("are",$a) === 1) {
   echo "true"; // are Found
 }
Shashank Singh
sumber
bagus, tetapi preg_match berisiko karena dapat mengembalikan false atau 0. Anda harus menguji untuk === 1 di # 3
Shapeshifter
14

Versi singkat

$result = false!==strpos($a, 'are');
Somwang Souksavatd
sumber
5
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Bono
14

Untuk menemukan 'kata', daripada munculnya serangkaian huruf yang sebenarnya bisa menjadi bagian dari kata lain, berikut ini akan menjadi solusi yang baik.

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

if (in_array('are', $array) ) {
    echo 'Found the word';
}
DJC
sumber
5
itu akan gagal jika $stringisAre are, are?
Cerah
13

Anda harus menggunakan format case sensitif, jadi jika nilai yang dimasukkan dalam smallatau capstidak masalah.

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

Di sini stripo menemukan jarum di heystack tanpa mempertimbangkan kasing (kecil / tutup).

Sampel PHPCode dengan output

Pratik
sumber
13

Mungkin Anda bisa menggunakan sesuatu seperti ini:

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

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

Jangan gunakan preg_match()jika Anda hanya ingin memeriksa apakah satu string terkandung dalam string lain. Gunakan strpos()atau strstr()sebagai gantinya karena mereka akan lebih cepat. ( http://in2.php.net/preg_match )

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

Jika Anda ingin memeriksa apakah string berisi beberapa kata spesifik, Anda dapat melakukan:

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

Ini berguna untuk menghindari spam saat mengirim email misalnya.

Julien
sumber
10

Fungsi strpos berfungsi dengan baik, tetapi jika Anda ingin case-insensitivememeriksa kata dalam sebuah paragraf maka Anda dapat menggunakan striposfungsi PHP.

Sebagai contoh,

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

Temukan posisi kemunculan pertama substring yang tidak peka huruf besar-kecil dalam string.

Jika kata itu tidak ada dalam string maka itu akan mengembalikan false kalau itu akan mengembalikan posisi kata.

Akshay Khale
sumber
9

Anda perlu menggunakan operator yang identik / tidak identik karena strpos dapat mengembalikan 0 sebagai nilai indeksnya. Jika Anda menyukai operator ternary, pertimbangkan untuk menggunakan yang berikut (sepertinya sedikit mundur saya akui):

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

Periksa apakah string berisi kata-kata tertentu?

Ini berarti string harus dipecahkan menjadi kata-kata (lihat catatan di bawah).

Salah satu cara untuk melakukan ini dan menentukan pemisah menggunakan 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');

?>

Berlari memberi

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

Catatan: Di sini kami tidak bermaksud kata untuk setiap urutan simbol.

Definisi praktis kata adalah dalam arti mesin ekspresi reguler PCRE, di mana kata-kata adalah substring yang hanya terdiri dari karakter kata, dipisahkan oleh karakter non-kata.

Karakter "kata" adalah huruf atau digit atau karakter garis bawah, yaitu karakter apa saja yang dapat menjadi bagian dari "kata" Perl. Definisi huruf dan angka dikendalikan oleh tabel karakter PCRE, dan dapat bervariasi jika pencocokan khusus lokal terjadi (..)

mvw
sumber
7

Solusi lain untuk string tertentu:

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

Anda juga dapat menggunakan strpos()fungsi.

devpro
sumber