it-swarm-vi.com

Làm thế nào để làm cho chúng tôi xem

Xem xét:

$a = 'How are you?';

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

Giả sử tôi có mã ở trên, cách chính xác để viết câu lệnh if ($a contains 'are') là gì?

2666
Charles Yeung

Bạn có thể sử dụng hàm strpos() được sử dụng để tìm sự xuất hiện của một chuỗi bên trong chuỗi khác:

$a = 'How are you?';

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

Lưu ý rằng việc sử dụng !== false là có chủ ý; strpos() trả về giá trị bù mà chuỗi kim bắt đầu trong chuỗi haystack hoặc boolean false nếu không tìm thấy kim. Vì 0 là phần bù hợp lệ và 0 là "falsey", nên chúng tôi không thể sử dụng các cấu trúc đơn giản hơn như !strpos($a, 'are').

6129
codaddict

Bạn có thể sử dụng các biểu thức thông thường, tốt hơn cho so khớp Word so với strpos như được đề cập bởi những người dùng khác, nó cũng sẽ trả về đúng cho các chuỗi như giá vé, chăm sóc, nhìn chằm chằm, v.v.

Một kết hợp đơn giản cho có thể trông giống như thế này:

$a = 'How are you?';

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

Về mặt hiệu suất, strpos nhanh hơn khoảng ba lần và trong tâm trí, khi tôi thực hiện một triệu so sánh cùng một lúc, phải mất preg_match 1,5 giây để hoàn thành và trong strpos mất 0,5 giây.

Chỉnh sửa: Để tìm kiếm bất kỳ phần nào của chuỗi, không chỉ Word by Word, tôi khuyên bạn nên sử dụng một biểu thức thông thường như

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

i ở cuối biểu thức chính quy thay đổi biểu thức chính quy thành không phân biệt chữ hoa chữ thường, nếu bạn không muốn điều đó, bạn có thể loại bỏ nó.

Bây giờ, điều này có thể khá rắc rối trong một số trường hợp vì chuỗi tìm kiếm $ không được vệ sinh theo bất kỳ cách nào, ý tôi là, nó có thể không vượt qua kiểm tra trong một số trường hợp vì nếu $search là đầu vào của người dùng, họ có thể thêm một số chuỗi có thể hành xử như một số biểu hiện thông thường khác nhau ...

Ngoài ra, đây là một công cụ tuyệt vời để kiểm tra và xem giải thích về các biểu thức chính quy khác nhau Regex101

Để kết hợp cả hai bộ chức năng thành một chức năng đa mục đích duy nhất (bao gồm cả độ nhạy trường hợp có thể lựa chọn), bạn có thể sử dụng một cái gì đó như thế này:

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

Đây là một chức năng tiện ích nhỏ hữu ích trong các tình huống như thế này

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

Mặc dù hầu hết các câu trả lời này sẽ cho bạn biết nếu một chuỗi con xuất hiện trong chuỗi của bạn, đó thường không phải là điều bạn muốn nếu bạn đang tìm kiếm một Word , và không phải là chuỗi con .

Có gì khác biệt? Chất nền có thể xuất hiện trong các từ khác:

  • "Là" ở đầu "khu vực"
  • "Là" ở cuối "thỏ"
  • "Là" ở giữa "giá vé"

Một cách để giảm thiểu điều này là sử dụng biểu thức chính quy được kết hợp với Ranh giới Word (\b):

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

Phương pháp này không có cùng dương tính giả được ghi nhận ở trên, nhưng nó có một số trường hợp Edge của riêng nó. Ranh giới từ khớp với các ký tự không phải từ (\W), sẽ là bất cứ thứ gì không phải là a-z, A-Z, 0-9 hoặc _. Điều đó có nghĩa là các chữ số và dấu gạch dưới sẽ được tính là các ký tự Word và các tình huống như thế này sẽ thất bại:

  • "Là" trong "Bạn đang nghĩ gì?"
  • "Là" trong "lol u dunno wut are4?"

Nếu bạn muốn bất cứ điều gì chính xác hơn điều này, bạn sẽ phải bắt đầu thực hiện phân tích cú pháp tiếng Anh và đó là một con giun khá lớn (và dù sao cũng sử dụng đúng cú pháp, không phải lúc nào cũng được đưa ra).

128
FtDRbwLXw6

Để xác định xem một chuỗi có chứa một chuỗi khác hay không, bạn có thể sử dụng hàm PHP function strpose () .

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

?>

THẬN TRỌNG:

Nếu kim bạn đang tìm kiếm ở đầu haystack, nó sẽ trả về vị trí 0, nếu bạn thực hiện so sánh == sẽ không hoạt động, bạn sẽ cần thực hiện ===

Dấu == là một so sánh và kiểm tra xem biến/biểu thức/hằng ở bên trái có cùng giá trị với biến/biểu thức/hằng ở bên phải hay không.

Dấu === là so sánh để xem hai biến/expresions/hằng có bằng nhau AND có cùng loại hay không - tức là cả hai đều là chuỗi hoặc cả hai đều là số nguyên.

109
Jose Vega

Hãy nhìn vào 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

Sử dụng strstr() hoặc stristr() nếu tìm kiếm của bạn không phân biệt chữ hoa chữ thường sẽ là một lựa chọn khác.

58
glutorange

Nhận xét ngang hàng với Samoody và Lego Stormtroopr.

Nếu bạn đang tìm kiếm một thuật toán PHP cho xếp hạng kết quả tìm kiếm dựa trên mức độ gần gũi/mức độ liên quan của nhiều từ ở đây sẽ tạo ra kết quả tìm kiếm nhanh chóng và dễ dàng với PHP chỉ có:

Các vấn đề với các phương thức tìm kiếm boolean khác, chẳng hạn như strpos(), preg_match(), strstr() hoặc stristr()

  1. không thể tìm kiếm nhiều từ
  2. kết quả là không được xếp hạng

PHP phương thức dựa trên Mô hình không gian vectơtf-idf (thuật ngữ tần số nghịch đảo tần số tài liệu):

Nghe có vẻ khó khăn nhưng dễ dàng đáng ngạc nhiên.

Nếu chúng ta muốn tìm kiếm nhiều từ trong một chuỗi, vấn đề cốt lõi là làm thế nào chúng ta gán trọng số cho từng từ đó?

Nếu chúng ta có thể cân nhắc các thuật ngữ trong một chuỗi dựa trên mức độ đại diện của toàn bộ chuỗi, chúng ta có thể sắp xếp các kết quả của mình theo các chuỗi phù hợp nhất với truy vấn.

Đây là ý tưởng của mô hình không gian vectơ, không xa cách hoạt động của tìm kiếm toàn văn bản 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;
}

TRƯỜNG HỢP 1

$query = 'are';

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

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

KẾT QUẢ

Array
(
    [1] => 0.52832083357372
)

TRƯỜNG HỢP 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>';

KẾT QUẢ

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

TRƯỜNG HỢP 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>';

KẾT QUẢ

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

Có rất nhiều cải tiến được thực hiện nhưng mô hình cung cấp một cách để có được kết quả tốt từ các truy vấn tự nhiên, không có các toán tử boolean như strpos(), preg_match(), strstr() hoặc stristr().

LỢI ÍCH

Tùy chọn loại bỏ sự dư thừa trước khi tìm kiếm các từ

  • do đó giảm kích thước chỉ mục và dẫn đến yêu cầu lưu trữ ít hơn

  • ít đĩa I/O

  • lập chỉ mục nhanh hơn và do đó tìm kiếm nhanh hơn.

1. Chuẩn hóa

  • Chuyển đổi tất cả văn bản sang chữ thường

2. Loại bỏ từ dừng

  • Loại bỏ các từ khỏi văn bản không có nghĩa thực sự (như 'và', 'hoặc', 'the', 'cho', v.v.)

3. Thay thế từ điển

  • Thay thế các từ bằng những từ khác có nghĩa giống hệt hoặc tương tự. (ví dụ: thay thế các trường hợp 'đói' và 'đói' bằng 'đói')

  • Các biện pháp thuật toán tiếp theo (Snowball) có thể được thực hiện để giảm thêm các từ theo nghĩa thiết yếu của chúng.

  • Việc thay thế tên màu bằng các số thập lục phân của chúng

  • Việc giảm các giá trị số bằng cách giảm độ chính xác là những cách khác để chuẩn hóa văn bản.

T&AGRAVE;I NGUY&ECIRC;N

43
RafaSashi

Sử dụng khớp không phân biệt chữ hoa chữ thường bằng stripos() :

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

Nếu bạn muốn tránh vấn đề "chim ưng" và "sự thật", bạn có thể sử dụng lớp nền:

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

Nó chậm hơn một chút so với strpose nhưng nó tránh được các vấn đề so sánh.

40
Alan Piralla

Một tùy chọn khác là sử dụng hàm strstr () . Cái gì đó như:

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

Điểm cần lưu ý: Hàm strstr () phân biệt chữ hoa chữ thường. Đối với tìm kiếm không phân biệt chữ hoa chữ thường, hãy sử dụng hàm stristr () .

31
YashG99

Tôi hơi ấn tượng rằng không có câu trả lời nào ở đây đã sử dụng strpos, strstr và các hàm tương tự được đề cập Hàm chuỗi đa chuỗi yet (2015-05-08).

Về cơ bản, nếu bạn gặp khó khăn khi tìm từ có ký tự cụ thể cho một số ngôn ngữ , chẳng hạn như tiếng Đức, tiếng Pháp, tiếng Bồ Đào Nha, tiếng Tây Ban Nha, v.v. (ví dụ: ä, é, ô, ç, º, ñ), bạn có thể muốn đặt trước các hàm với mb_. Do đó, câu trả lời được chấp nhận sẽ sử dụng mb_strpos hoặc mb_stripos (đối với trường hợp khớp không phân biệt chữ hoa chữ thường):

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

Nếu bạn không thể đảm bảo rằng tất cả dữ liệu của bạn là 100% trong UTF-8 , bạn có thể muốn sử dụng các hàm mb_.

Một bài viết hay để hiểu tại sao là Tối thiểu tuyệt đối Mỗi nhà phát triển phần mềm Tuyệt đối, Tích cực phải biết về Unicode và Bộ ký tự (Không có lý do!) by Joel Spolsky.

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

Chức năng dưới đây cũng hoạt động và không phụ thuộc vào bất kỳ chức năng nào khác; nó chỉ sử dụng thao tác chuỗi PHP riêng. Cá nhân, tôi không khuyên bạn điều này, nhưng bạn có thể thấy nó hoạt động như thế nào:

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

Kiểm tra:

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

Trong PHP, cách tốt nhất để xác minh xem một chuỗi có chứa một chuỗi con nhất định hay không, là sử dụng hàm trợ giúp đơn giản như thế này:

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

Giải trình:

  • strpos tìm vị trí xuất hiện đầu tiên của chuỗi con phân biệt chữ hoa chữ thường trong chuỗi.
  • stripos tìm vị trí xuất hiện đầu tiên của chuỗi con không phân biệt chữ hoa chữ thường trong chuỗi.
  • myFunction($haystack, $needle) === FALSE ? FALSE : TRUE đảm bảo rằng myFunction luôn trả về boolean và sửa hành vi không mong muốn khi chỉ số của chuỗi con là 0.
  • $caseSensitive ? A : B chọn một trong hai strpos hoặc stripos để thực hiện công việc, tùy thuộc vào giá trị của $caseSensitive.

Đầu ra:

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

Bạn có thể sử dụng hàm strstr:

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

if ($flag){

    echo "true";
}

Không sử dụng chức năng sẵn có:

$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

Tôi đã có một số rắc rối với điều này, và cuối cùng tôi đã chọn để tạo ra giải pháp của riêng tôi. Không sử dụng biểu thức chính quy 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;
 }

Bạn có thể nhận thấy rằng các giải pháp trước đây không phải là câu trả lời cho Word đang được sử dụng làm tiền tố cho một giải pháp khác. Để sử dụng ví dụ của bạn:

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

Với các mẫu ở trên, cả $a$b đều chứa $c, nhưng bạn có thể muốn hàm của bạn cho bạn biết rằng chỉ $a chứa $c.

21
Decebal

Một tùy chọn khác để tìm sự xuất hiện của Word từ một chuỗi bằng cách sử dụng strstr ()stristr () giống như sau:

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

Để tìm một "Từ", thay vì sự xuất hiện của một loạt các chữ cái trong thực tế có thể là một phần của một từ khác, sau đây sẽ là một giải pháp tốt.

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

if (in_array('are', $array) ) {
    echo 'Found the Word';
}
14
DJC

Nó có thể được thực hiện theo ba cách khác nhau:

 $a = 'How are you?';

1- stristr ()

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

2- strpose ()

 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

Phiên bản tay ngắn

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

Bạn nên sử dụng định dạng Không phân biệt chữ hoa chữ thường, vì vậy nếu giá trị được nhập là small hoặc caps thì không vấn đề gì.

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

Ở đây, các sọc tìm thấy kim trong heystack không có trường hợp xem xét (nhỏ/mũ).

Mẫu PHPCode có đầu ra

13
Pratik C Joshi

Rất nhiều câu trả lời sử dụng substr_count kiểm tra xem kết quả có phải là >0 không. Nhưng vì câu lệnh if coi không giống như false , bạn có thể tránh kiểm tra đó và viết trực tiếp:

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

Để kiểm tra xem không hiện tại, hãy thêm toán tử !:

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

Có lẽ bạn có thể sử dụng một cái gì đó như thế này:

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

Không sử dụng preg_match() nếu bạn chỉ muốn kiểm tra xem một chuỗi có được chứa trong chuỗi khác không. Thay vào đó, hãy sử dụng strpos() hoặc strstr() vì chúng sẽ nhanh hơn. ( http://in2.php.net/preg_match )

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

Nếu bạn muốn kiểm tra xem chuỗi có chứa một số từ cụ thể không, bạn có thể thực hiện:

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

Điều này rất hữu ích để tránh thư rác khi gửi email chẳng hạn.

10
Julien

Bạn cần sử dụng các toán tử giống hệt/không giống nhau vì strpose có thể trả về 0 làm giá trị chỉ mục. Nếu bạn thích các toán tử ternary, hãy cân nhắc sử dụng các thao tác sau (có vẻ hơi ngược tôi sẽ thừa nhận):

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

Hàm strpose hoạt động tốt, nhưng nếu bạn muốn làm case-insensitive kiểm tra Word trong một đoạn thì bạn có thể sử dụng hàm stripos của PHP.

Ví dụ,

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

Tìm vị trí xuất hiện đầu tiên của chuỗi con không phân biệt chữ hoa chữ thường trong chuỗi.

Nếu Word không tồn tại trong chuỗi thì nó sẽ trả về false, nó sẽ trả về vị trí của Word.

9
Akshay Khale

Kiểm tra xem chuỗi có chứa từ cụ thể không?

Điều này có nghĩa là chuỗi phải được giải quyết thành các từ (xem ghi chú bên dưới).

Một cách để làm điều này và chỉ định các dấu phân cách là sử dụng 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');

?>

Chạy cho

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

Lưu ý: Ở đây chúng tôi không có nghĩa là Word cho mỗi chuỗi ký hiệu.

Một định nghĩa thực tế của Word theo nghĩa là công cụ biểu thức chính quy PCRE, trong đó các từ là các chuỗi con chỉ bao gồm các ký tự Word, được phân tách bằng các ký tự không phải là Word.

Ký tự "Word" là bất kỳ chữ cái hoặc chữ số hoặc ký tự gạch dưới, nghĩa là, bất kỳ ký tự nào có thể là một phần của "Từ" Perl. Định nghĩa của các chữ cái và chữ số được điều khiển bởi các bảng ký tự của PCRE và có thể thay đổi nếu diễn ra kết hợp cụ thể theo địa phương (..)

8
mvw

Một chuỗi có thể được kiểm tra với chức năng dưới đây:

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

Một giải pháp khác cho một chuỗi cụ thể:

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

Bạn cũng có thể sử dụng chức năng strpos().

6
devpro

Sử dụng:

$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

Một lựa chọn đơn giản hơn:

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

Tôi nghĩ rằng một ý tưởng tốt là sử dụng mb_stpos:

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

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

    echo 'true';
}

Vì giải pháp này là phân biệt chữ hoa chữ thườngan toàn cho tất cả các ký tự Unicode.


Nhưng bạn cũng có thể làm như thế này ( phản hồi sauch chưa được ):

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

    echo 'true';
}

Giải pháp này cũng là phân biệt chữ hoa chữ thườngan toàn cho các ký tự Unicode.

Ngoài ra, bạn không sử dụng phủ định trong biểu thức, làm tăng khả năng đọc của mã.


Đây là giải pháp khác sử dụng hàm:

function isContainsStr($haystack, $needle) {

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

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

    echo 'true';
}
4
simhumileco

Sử dụng:

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

Nó thực hiện một hoạt động strpose () an toàn nhiều byte.

3
Mindexperiment

Bạn cũng có thể sử dụng các hàm tích hợp strchr()strrchr() và các tiện ích mở rộng cho chuỗi đa chuỗi mb_strchr()mb_strrchr() . Các hàm này trả về các phần của chuỗi và FALSE nếu không tìm thấy gì.

  • strchr() - Tìm sự xuất hiện đầu tiên của chuỗi (là bí danh của strstr() ).
  • strrchr() - Tìm sự xuất hiện cuối cùng của một ký tự trong chuỗi.
3
Aleksey Bykov