文字列に特定の単語が含まれているかどうかを確認するにはどうすればよいですか?


2661

検討してください:

$a = 'How are you?';

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

上記のコードがあるとすると、ステートメントを記述する正しい方法は何if ($a contains 'are')ですか?

回答:


6894

strpos()別の文字列内の1つの文字列の出現を見つけるために使用される関数を使用できます。

$a = 'How are you?';

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

の使用!== falseは意図的なものであることに注意してください(望ましい結果が返されることもあり!= falseません=== true)。strpos()針の文字列がhaystack文字列で始まるオフセット、またはfalse針が見つからない場合はブール値を返します。0は有効なオフセットであり、0は「偽」であるため、などの単純な構成を使用することはできません!strpos($a, 'are')


261
パーティーには非常に遅れますが、これには注意してください。これは、文字列「Do you care?」に対してtrueを返します。
DTest 2012

167
@DTest-はい。もちろん、文字列に「are」が含まれているため、trueが返されます。あなたは単語のために特別に探している場合は、文字またはスペースがAの前と後にE.がある場合、あなたは、例えば、チェック、などの多くのチェックを行う必要があるだろうARE
jsherk

40
上記の非常に良いコメント!私は!=または==を使用することはありません。結局、!==と===が(私の意見では)すべての側面(速度、精度など)を考慮した最良のオプションです。
Melsi

10
@jsherkでは、なぜ正規表現を使用しないのですか?「のようなもの」です。
Giulio Muscarello 2013年

22
私は常にstrpos($a, 'are') > -1真のテストに使用することでこの問題を回避する傾向があります。デバッグの観点から見ると、連続する等号を数える必要がないときに、脳が無駄にクロックサイクルを無駄にして、ラインが正しく記述されているかどうかがわかります。
equazcion 2014年

608

正規表現を使用することもできます。strpos他のユーザーが言及するよりも単語の照合に適しています。運賃、世話、凝視などの文字列に対してもtrueを返します。これは、単語の境界を使用することで、正規表現で簡単に回避できます。

の単純な一致は次のようになります。

$a = 'How are you?';

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

パフォーマンスの面でstrposは、約3倍高速であり、100万回の比較を一度に行った場合preg_match、完了するまでに1.5秒strposかかり、0.5秒かかりました。

編集:単語ごとだけでなく、文字列の任意の部分を検索するために、次のような正規表現を使用することをお勧めします

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

i正規表現の終わりには、あなたがそれをしたくない場合は、あなたがそれを残すことができ、大文字と小文字を区別しないように正規表現を変更します。

$ search文字列はどのようにもサニタイズされていないため、これは場合によっては非常に問題になる可能性$searchがあります。つまり、ユーザー入力であるかのように動作し、いくつかの異なる正規表現...

また、さまざまな正規表現Regex101のテストを行い、その説明を表示するための優れたツールもここにあります

両方の機能セットを1つの多目的関数(大文字と小文字の区別を選択可能にすることを含む)に組み合わせるには、次のようなものを使用できます。

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
@ Alexander.Plutov 2番目に、質問ではなく-1を私に与えていますか?それが2秒かかりCMON回答Googleにgoogle.com/...
ブリーザ

64
+1単純な文字列を検索するのは恐ろしい方法ですが、SOへの訪問者の多くは、自分の部分文字列を検索する方法を探しています。OPでも単純化しすぎている可能性があります。代替案を彼に知らせてください。
SamGoody

72
技術的には、質問は部分文字列ではなく単語を見つける方法を尋ねます。これは、正規表現の単語境界でこれを使用できるので、実際に役立ちました。代替案は常に役立ちます。

15
答えは+ 1、@ plutov.byコメントは-1です。なぜなら、strposは単一のチェックにすぎないのに対し、正規表現では、同時に多くの単語を同時にチェックできますex:preg_match(/ are | you | not /)
albanx

4
正規表現は最後の手段です。ささいなタスクでの使用はお勧めできません。私は長年の悪いコードの掘り起こしの高さからこれを主張しています。
円通2015

257

このような状況で役立つ小さなユーティリティ関数を次に示します

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

74
@RobinvanBaalen実際、コードを読みやすくすることができます。また、反対投票は(非常に)悪い回答のためのものであり、「中立」の回答のためのものではありません。
Xaqq 2013

37
@RobinvanBaalen関数は、定義上、読みやすさを考慮したものです(何をしているのかを伝えるため)。どちらがより読みやすいif ($email->contains("@") && $email->endsWith(".com)) { ...か比較してください:またはif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
Brandin

3
エンドルールの@RobinvanBaalenは破られることを意図しています。そうでなければ、人々は物事を行うための新しい独創的な方法を思い付かないでしょう:)。加えて、martinfowler.comのようなものに心を包み込むのに苦労していることを認めなければなりません。正しいことは、自分で試してみて、最も便利な方法を見つけることです。
James P.

5
別の意見:簡単にラップできるユーティリティ関数があると、デバッグに役立ちます。また、プロダクションサービスにおけるこのようなオーバーヘッドを排除する優れたオプティマイザへの叫びを和らげます。したがって、すべての意見には有効なポイントがあります。;)
Tino

18
もちろんこれは便利です。あなたはこれを奨励すべきです。PHP 100で文字列の場所を見つけるための新しいより高速な方法がある場合はどうなりますか?strposを呼び出すすべての場所を変更しますか?または、関数内の包含のみを変更しますか?
Cosmin、2015年

143

これらの回答のほとんどは、部分文字列が文字列に出現するかどうかを示しますが、通常は、部分文字列ではなく特定の単語を探している場合は、これは望ましくありません。

違いは何ですか?部分文字列は他の単語内に現れることができます:

  • 「地域」のはじまりの「ある」
  • 「hare」の最後の「are」
  • 「運賃」の真ん中にある「あれ」

これを軽減する1つの方法は、単語の境界\b)と組み合わせた正規表現を使用することです。

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

このメソッドには、上記と同じ誤検知はありませんが、独自のエッジケースがいくつかあります。単語の境界は、(非単語の文字に一致し\Wないものであることを行っている、) 、a-zA-Z0-9または_。つまり、数字とアンダースコアは単語文字としてカウントされ、次のようなシナリオは失敗します。

  • 「何を考えているの?」の「ある」
  • 「lol u dunno wut that are4?」の「are」?

これよりも正確なものが必要な場合は、英語の構文解析を開始する必要があります。これはかなり大きなワームの缶です(とにかく、常に正しいとは限らない構文の適切な使用を前提としています)。


24
これが正解です。部分文字列ではなく単語を探しているため、正規表現が適切です。私もその追加します試合に二つのこと見つけるためのそれは素晴らしい作るおり、ないの単語を文字列に:それは文字列の先頭と一致する()と文字列(の終わり)\b\W^$
code_monk

これが正しい答えでなければなりません。..答えの残りの部分は、「あなたが気にしません」のような文字列に「さ」でしょう。..としては@Dtestで言及
ロバート・シンクレア

@RobertSinclair悪いですか?文字列「do you care」に「are」という単語が含まれているかどうかを尋ねた場合、「yes」と言います。「ある」という言葉は明らかにその文字列の部分文字列です。これは、「」は「あります」という文字列の単語の1つです「do you care」「」とは別の質問です。
ポール、

@Paulpro Eventhough OPは$ aがフレーズであることを指定していませんでした。それで、彼の質問は、フレーズの中の単語をどのように検出するかでした。Wordの中にWordが含まれている場合でも、私はそれが無関係であることが多いと思います。
Robert Sinclair

@Jimboは動作しますが、 `\` 3v4l.org/ZRpYi
MetalWeirdoを

125

文字列に別の文字列が含まれているかどうかを確認するには、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";
}

?>

注意:

検索している針が干し草の山の始めにある場合、位置0を返します。機能しない==比較を行う場合は、===

==記号は左に可変/発現/定数が右に可変/発現/定数と同じ値を有するかどうかを比較テストです。

===記号は、2つの変数/ expresions /定数が等しいかどうかを確認するために比較され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の注意事項:ページが特定の針が干し草の山の中に発生した場合にのみ、決定したい場合は、より速く、より少ないメモリ集約関数strpos()を代わりに使用します。
Jo Smo、2014

@tastroこれに関して信頼できるベンチマークはありますか?
ウェインホイッティ2014年

これは遅いかもしれませんが、IMHO strstr($a, 'are')は醜いものよりはるかにエレガントですstrpos($a, 'are') !== false。PHPには本当にstr_contains()関数が必要です。
Paul Spiegel

これは受け入れられない答えだと私の心を吹き飛ばします
kurdtpage


45

SamGoodyピアとLego Stormtrooprのコメント。

複数の単語の近接性/関連性基づいて検索結果ランク付けするPHPアルゴリズムを探している場合、PHPのみで検索結果を生成する迅速かつ簡単な方法がここにあります。

他のブール検索方法の問題などstrpos()preg_match()strstr()またはstristr()

  1. 複数の単語を検索できません
  2. 結果はランク付けされていません

Vector Space Modeltf-idf(term frequency–inverse document frequency)に基づくPHPメソッド

難しいように聞こえますが、驚くほど簡単です。

文字列内の複数の単語を検索する場合、核となる問題は、それぞれの単語に重みを割り当てる方法です。

全体としての文字列の代表度に基づいて文字列内の用語に重みを付けることができれば、クエリに最も一致するもので結果を並べることができます。

これはベクトル空間モデルの考え方であり、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;
}

ケース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
)

ケース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
)

ケース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()

NOTA BENE

必要に応じて、単語を検索する前に冗長性を排除します

  • これにより、インデックスのサイズが小さくなり、必要なストレージが少なくなります。

  • ディスクI / Oの削減

  • インデックス作成が高速になり、結果として検索が高速になります。

1.正規化

  • すべてのテキストを小文字に変換します

2.ストップワードの削除

  • テキストから実際の意味を持たない単語を削除します(「and」、「or」、「the」、「for」など)。

3.辞書の置換

  • 単語を、同一または類似の意味を持つ他のものに置き換えます。(例:「ハングリー」と「ハングリー」のインスタンスを「ハンガー」に置き換える)

  • さらなるアルゴリズム的手段(雪だるま式)を実行して、単語をそれらの本質的な意味にさらに減らすことができる。

  • 色の名前を16進数の色に置き換える

  • 精度を下げることによる数値の削減は、テキストを正規化する他の方法です。

リソース


40

「偽り」と「真実」の問題を回避したい場合は、substr_countを使用できます。

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

strposより少し遅いですが、比較の問題を回避します。


これは、返すfalseために、「あなたはよろしいですか?」位置は以降strposである0
Hafenkranich

30

別のオプションは、strstr()関数を使用することです。何かのようなもの:

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

注意点:strstr()関数は大文字と小文字を区別します。大文字と小文字を区別しない検索の場合は、stristr()関数を使用します。


1
針が見つからなかった場合、strstr()はFALSEを返します。したがって、ストレンは必要ありません。
Ayesh K 2012

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

3
次の警告が表示されますWARNING preg_match(): Delimiter must not be alphanumeric or backslash
。– Pathros

27

私は少し使用することをここに答えのいずれもが感動しないよstrposstrstrと同様の機能が言及したマルチバイト文字列関数をまだ(2015年5月8日)。

基本的に、ドイツ語、フランス語、ポルトガル語、スペイン語など、一部の言語固有の文字(例:äéôçºñを含む単語を見つけるのに問題がある場合は、前に進むことをお勧めします。の機能mb_。したがって、受け入れられた回答は、代わりにmb_strposまたはmb_stripos(大文字と小文字を区別しないマッチングの場合)を使用します。

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

すべてのデータがUTF-8100%であることを保証できない場合は、mb_関数を使用することをお勧めします。

Joel SpolskyによるUnicodeと文字セット(言い訳なし!)について、絶対にすべてのソフトウェア開発者が絶対に最低限必要であることを理解するための良い記事です。


25

PHPでは、文字列に特定の部分文字列が含まれているかどうかを確認する最良の方法は、次のような単純なヘルパー関数を使用することです。

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文字列操作のみを使用します。個人的には、これはお勧めしませんが、それがどのように機能するかを見ることができます:

<?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
strposが完全に実行可能なソリューションであるのに、なぜこのような関数を使用するのでしょうか?
sg3s

3
@ sg3s:完全に正しいですが、strposもそのようなものに基づいています。また、ちょっとした知識を共有するためだけに担当者に投稿しませんでした
Jason OOO

最後のvar_dumpはfalseです
サニー

1
@サニー:タイプミスでした:var_dump(is_str_contain( "mystringss"、 "strings")); // true
Jason OOO

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 2016年

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初めに
15:12の

1
単語がコンマ、疑問符、またはドットでリンクされている場合、関数が機能しない可能性があります。例えば、「あなたが見るものはあなたが得るものです。」そして、「get」が文の中にあるかどうかを判断したいとします。「get」の横の完全なストップに注意してください。この場合、関数はfalseを返します。文字列の検索/置換には、正規表現またはsubstr(とにかく正規表現を使用すると思います)を使用することをお勧めします。
lightbringer 2015

@lightbringerあなたはあなたの推薦でもっと間違っているはずがありません、それはあなたにとって「それが推薦されている」とはどういう意味ですか?推薦または承認する最高人はいません。言語自体のブラックホールであるphpでの正規表現エンジンの使用についてです。正規表現の一致をループに入れて結果をベンチマークすることをお勧めします。
Decebal 2015

この答えは十分に実証されておらず、多くの拡張シナリオで失敗します。このテクニックを楽しませるメリットはないと思います。洗練されたカスタム関数と反復呼び出しは次のとおりです。3v4l.org / E9dfDこのwikiは、研究者の時間を浪費するため、編集に興味がありません。
mickmackusa

18

使用して文字列から単語の出現を見つけるための別のオプションはstrstr())stristrは(次のようなものです:

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

これは逆です。i中には、stristr小文字を区別しないの略です。
Adam Merrifield、2014

18

substr_count結果がであるかどうかのチェックを使用する多くの回答>0。しかし、ifステートメントはゼロをfalseと同じと見なすため、そのチェックを回避して直接書き込むことができます。

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

存在しないかどうかを確認するには、!演算子を追加します。

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

まあ...部分的にtrue、phpでは0 == falseはtrueですが、0 === falseはfalseです
Andrejs Gubars

17

これは、3つの異なる方法で実行できます。

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

良いですが、preg_matchはfalseまたは0を返す可能性があるため危険です。#3で=== 1をテストする必要があります
Shapeshifter

14

簡略版

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

5
このコードスニペットは問題を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来の読者のための質問に答えていることを覚えておいてください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。
Bono

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

ここで、striposは大文字と小文字を区別せずに、heystackで針を見つけます。

出力付きのPHPCodeサンプル


13

多分あなたはこのようなものを使うことができます:

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

    function findWord($text) {
        if (strstr($text, 'ok')) {
            echo 'Found a word';
        }
        else
        {
            echo 'Did not find a 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";
}

これは、たとえばメールを送信するときにスパムを回避するのに役立ちます。


10

strpos関数は問題なく機能しcase-insensitiveますが、段落内の単語をチェックする場合は、のstripos関数を使用できますPHP

例えば、

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

文字列内で大文字と小文字を区別しない部分文字列が最初に出現する位置を見つけます。

単語が文字列に存在しない場合はfalseを返し、それ以外の場合は単語の位置を返します。


9

strposはインデックス値として0を返す可能性があるため、同一または同一ではない演算子を使用する必要があります。三項演算子が好きな場合は、以下を使用することを検討してください(私が認めるように少し後方に思えます)。

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

8

文字列に特定の単語が含まれているかどうかを確認しますか?

これは、文字列を単語に解決する必要があることを意味します(下記の注を参照)。

これを行い、セパレーターを指定する1つの方法は、preg_splitdoc)。

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

注:ここでは、記号のすべてのシーケンスの単語を意味するわけではありません。

単語の実用的な定義は、ある意味ではPCRE正規表現エンジンです。この場合、単語は単語以外の文字で区切られた単語文字のみで構成される部分文字列です。

「単語」文字とは、任意の文字、数字、またはアンダースコア文字、つまり、Perl「単語」の一部になることができる任意の文字です。文字と数字の定義はPCREの文字テーブルによって制御され、ロケール固有のマッチングが行われている場合(..)


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.