Pertanyaan Bagaimana cara memeriksa apakah 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 itu if ($a contains 'are')?


2668


asal


Jawaban:


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

$a = 'How are you?';

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

Perhatikan bahwa penggunaan !== false disengaja; strpos() mengembalikan baik offset di mana string jarum dimulai pada string tumpukan jerami, atau boolean false jika jarumnya tidak ditemukan. Karena 0 adalah offset yang valid dan 0 adalah "falsey", kita tidak dapat menggunakan konstruksi yang lebih sederhana !strpos($a, 'are').


5436



Anda dapat menggunakan ekspresi reguler, lebih baik untuk pencocokan kata dibandingkan dengan string seperti yang disebutkan oleh pengguna lain, itu juga akan mengembalikan true untuk string seperti ongkos, perawatan, tatapan dll. Hal ini dapat dihindari dalam ekspresi reguler dengan menggunakan batas kata.

Sebuah kecocokan sederhana untuk dapat terlihat seperti ini:

$a = 'How are you?';

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

Di sisi kinerja, stros adalah sekitar tiga kali lebih cepat dan ada dalam pikiran, ketika saya melakukan satu juta perbandingan sekaligus, butuh waktu 1,5 detik untuk menyelesaikan pertandingan dan untuk pengadukan butuh waktu 0,5 detik.


450



Berikut ini adalah fungsi utilitas kecil yang berguna dalam situasi seperti ini

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

195



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, dan bukan substring.

Apa bedanya? Substring dapat muncul dengan kata lain:

  • "Are" di awal "area"
  • "Ada" di ujung "kelinci"
  • "Ada" di tengah "tarif"

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

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

Metode ini tidak memiliki kesalahan positif yang sama yang disebutkan di atas, tetapi ia memiliki beberapa kasus yang menonjol. Batas kata cocok dengan karakter bukan kata (\W), yang akan menjadi apa pun yang tidak a-z, A-Z, 0-9, atau _. Itu berarti angka dan garis bawah akan dihitung sebagai karakter kata dan skenario seperti ini akan gagal:

  • "Ada" di "Apa yang Anda pikirkan?"
  • "Apakah" dalam "lol u dunno wut are are4?"

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


113



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, maka akan mengembalikan posisi 0, jika Anda melakukan == bandingkan yang tidak akan berfungsi, Anda perlu melakukan a ===

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

SEBUAH === tanda adalah perbandingan untuk melihat apakah dua variabel / ekspresi / konstanta sama ANDmemiliki jenis yang sama - yaitu keduanya string atau keduanya adalah bilangan bulat.


92



Menggunakan strstr() atau stristr() jika pencarian Anda harus peka huruf besar-kecil akan menjadi pilihan lain.


57



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

55