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


Answers

正規表現を使用することもできます。他のユーザーが述べたstrposと比較して単語マッチングに適しています。これは、運賃、ケア、凝視などの文字列に対してもtrueを返します。これは、単語境界を使って正規表現で単純に避けることができます。

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

$a = 'How are you?';

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

性能面では、strposは約3倍速く、一度に100万回比較したときには1.5秒で終了し、strposでは0.5秒かかりました。

Question

検討してください:

$a = 'How are you?';

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

上記のコードがあるとします。 if ($a contains 'are') 、文を書く正しい方法は何ですか?




文字列にいくつかの具体的な単語が含まれているかどうかを確認するには、次のようにします。

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

これは、例えば電子メールを送るときに迷惑メールを避けるのに便利です。




たぶんあなたは次のようなものを使うことができます:

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

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



stristr()stristr()を使用して文字列から単語の出現を見つける別のオプションは、次のようになります。

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



stripos()を使用してcase-insensitveマッチングを利用する:

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



以下の関数も動作し、他の関数に依存しません。 ネイティブの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 



大文字と小文字を区別しない形式を使用する必要があります。入力した値が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";
}
?>

ここでは、ストライポは、大文字小文字(大文字/小文字) 考慮せずにheystackで針を見つけます。

出力付きPHPCodeサンプル




私はこれにいくつかの問題を抱えていましたが、ついに自分のソリューションを作成することにしました。 正規表現エンジンを使用しない場合:

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$b両方に$cが含まれていますが、関数に$aのみに$cが含まれていることを伝えたい場合があります。




ある文字列が別の文字列に含まれているかどうかだけを確認する場合は、 preg_match()使用しないでください。 より高速になるので、 strpos()またはstrpos()代わりに使用してください。 ( http://in2.php.net/preg_match

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



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



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($haystack, $needle) === FALSE ? FALSE : TRUEは、 myFunction常にブール値を返すようにし、部分文字列のインデックスが0のときに予期しない動作を修正します。
  • $caseSensitive ? A : B $caseSensitive ? A : Bは、 $caseSensitive値に応じて、 strpos()またはstripos()いずれかを選択して作業を行います。

出力:

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)



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

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

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




結果が>0かどうかを調べるsubstr_countを使用する多くの回答。 しかし、 if文ではfalseと同じ 0が考慮されるため、チェックや書込みを直接避けることができます。

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

存在しないかどうかを確認するには、 ! オペレーター:

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



このような状況で便利な小さなユーティリティ関数があります

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



文字列に別の文字列が含まれているかどうかを調べるには、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を返します。 ==比較すると動作しない場合は、 ===を実行する必要があります

A ==符号は比較であり、左側の変数/式/定数が右側の変数/式/定数と同じ値を持つかどうかをテストします。

A ===符号は、2つの変数/式/定数が等しいかどうかを調べ、同じ型を持つかどうかを比較するためのものです。つまり、両方が文字列か両方が整数です。




Related



Tags

php php   string