pengembangan-web-mp.com

Bagaimana cara saya memeriksa apakah suatu string berisi kata tertentu?

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

2666
Charles Yeung

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

$a = 'How are you?';

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

Perhatikan bahwa penggunaan !== false disengaja; strpos() mengembalikan offset di mana string jarum dimulai pada string tumpukan jerami, atau false boolean jika 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').

6129
codaddict

Anda dapat menggunakan ekspresi reguler, lebih baik untuk pencocokan kata dibandingkan dengan strpos seperti yang disebutkan 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, strpos sekitar tiga kali lebih cepat dan ada dalam pikiran, ketika saya melakukan satu juta perbandingan sekaligus, butuh preg_match 1,5 detik untuk selesai dan untuk strpos butuh 0,5 detik.

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

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

i di akhir ekspresi reguler mengubah ekspresi reguler menjadi case-sensitive, 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 $search adalah input 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.
}
528
Breezer

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

Sementara sebagian besar jawaban ini akan memberi tahu Anda jika substring muncul di string Anda, itu biasanya tidak seperti yang Anda inginkan jika Anda mencari Word , 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 memitigasi hal 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 Edge sendiri. Batas kata cocok dengan karakter non-Word (\W), yang akan menjadi apa saja yang bukan a-z, A-Z, 0-9, atau _. Itu berarti angka dan garis bawah akan dihitung karena karakter dan skenario Word 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 kaleng cacing yang cukup besar (dan mengasumsikan penggunaan sintaks yang tepat, yang tidak selalu diberikan).

128
FtDRbwLXw6

Untuk menentukan apakah suatu 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";
}

?>

PERHATIAN:

Jika jarum yang Anda cari ada di awal tumpukan jerami itu akan mengembalikan posisi 0, jika Anda melakukan perbandingan == yang tidak berfungsi, Anda perlu melakukan ===

Tanda == adalah perbandingan dan menguji apakah variabel/ekspresi/konstan ke kiri memiliki nilai yang sama dengan variabel/ekspresi/konstan ke kanan.

Tanda === adalah perbandingan untuk melihat apakah dua variabel/ekspresi/konstanta sama AND memiliki jenis yang sama - yaitu string atau keduanya bilangan bulat.

109
Jose Vega

Lihatlah 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

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

58
glutorange

Mengintip komentar SamGoody dan Lego Stormtroopr.

Jika Anda mencari algoritme PHP untuk memberi peringkat hasil pencarian berdasarkan kedekatan/relevansi dari banyak kata inilah cara cepat dan mudah menghasilkan hasil pencarian dengan PHP hanya:

Masalah dengan metode pencarian boolean lainnya seperti strpos(), preg_match(), strstr() atau stristr()

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

PHP metode berdasarkan Model Ruang Vektor 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 memberi 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 ini 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

  • sehingga mengurangi ukuran indeks dan menghasilkan kebutuhan penyimpanan yang lebih sedikit

  • lebih sedikit disk I/O

  • pengindeksan lebih cepat dan pencarian yang konsekuensinya lebih cepat.

1. Normalisasi

  • Ubah semua teks menjadi huruf kecil

2. Penghapusan kata kunci

  • 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

43
RafaSashi

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.

40
Alan Piralla

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

31
YashG99

Saya agak terkesan bahwa tidak ada jawaban di sini yang menggunakan strpos, strstr dan fungsi serupa yang 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_strpos atau 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 fungsi mb_.

Artikel yang bagus untuk memahami mengapa adalah Minimum Mutlak Setiap Pengembang Perangkat Lunak Benar, Positif Harus Tahu Tentang Unicode dan Karakter Set (Tanpa Alasan!) oleh Joel Spolsky.

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

Fungsi di bawah ini juga berfungsi dan tidak bergantung pada fungsi lainnya; hanya menggunakan manipulasi string asli PHP. 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 
23
Jason OOO

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 substring peka huruf besar-kecil dalam sebuah string.
  • stripos menemukan posisi kemunculan pertama dari substring yang tidak peka huruf besar-kecil dalam sebuah string.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE memastikan bahwa myFunction selalu mengembalikan boolean dan memperbaiki perilaku yang tidak terduga ketika indeks substring adalah 0.
  • $caseSensitive ? A : B memilih strpos atau stripos untuk melakukan 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)
22
John Slegers

Anda dapat menggunakan fungsi strstr:

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

if ($flag){

    echo "true";
}

Tanpa menggunakan fungsi 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 ";
}
21
Arshid KV

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

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 Word 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, baik $a dan $b berisi $c, tetapi Anda mungkin ingin fungsi Anda memberi tahu Anda bahwa hanya $a berisi $c.

21
Decebal

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';
?>
16
Sadikhasan

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';
}
14
DJC

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
 }
14
Shashank Singh

Versi singkat

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

Anda harus menggunakan format case sensitif, jadi jika nilai yang dimasukkan dalam small atau caps itu tidak 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 case (kecil/tutup).

Sampel PHPCode dengan output

13
Pratik C Joshi

Banyak jawaban yang menggunakan substr_count memeriksa apakah hasilnya >0. Tetapi karena pernyataan if menganggap nol sama dengan false , Anda dapat menghindari centang itu dan menulis langsung:

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

Untuk memeriksa apakah not present, tambahkan operator !:

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

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';
        }
    }
?>
12
Mathias Stavrou

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

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

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.

10
Julien

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';
9
Shapeshifter

Fungsi strpos berfungsi dengan baik, tetapi jika Anda ingin melakukan case-insensitive memeriksa sebuah kata dalam paragraf maka Anda dapat menggunakan fungsi stripos dari 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 sebuah string.

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

9
Akshay Khale

Periksa apakah string berisi kata-kata spesifik?

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 kita tidak bermaksud Word untuk setiap urutan simbol.

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

Karakter "Word" 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 lokal spesifik terjadi (..)

8
mvw

Sebuah string dapat diperiksa dengan fungsi di bawah ini:

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

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 fungsi strpos().

6
devpro

Menggunakan:

$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

Opsi yang lebih sederhana:

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

Saya pikir ide yang bagus adalah menggunakan mb_stpos:

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

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

    echo 'true';
}

Karena solusi ini case sensitive dan aman untuk semua karakter Unicode .


Tetapi Anda juga dapat melakukannya seperti ini ( respons sauch belum ):

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

    echo 'true';
}

Solusi ini juga case sensitive dan aman untuk karakter Unicode .

Selain itu Anda jangan menggunakan negasi dalam ekspresi , yang meningkatkan keterbacaan kode .


Berikut ini solusi lain menggunakan fungsi :

function isContainsStr($haystack, $needle) {

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

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

    echo 'true';
}
4
simhumileco

Menggunakan:

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

Ini melakukan operasi strpos () aman multi-byte.

3
Mindexperiment

Anda juga dapat menggunakan fungsi bawaan strchr() dan strrchr() dan ekstensi untuk string multibyte mb_strchr() dan mb_strrchr() Fungsi-fungsi ini mengembalikan bagian dari string, dan FALSE jika tidak ada yang ditemukan.

  • strchr() - Temukan kemunculan pertama string (alias strstr() ).
  • strrchr() - Temukan kemunculan karakter terakhir dalam sebuah string.
3
Aleksey Bykov