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




php url ワイルド カード (24)

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

検討してください:

$a = 'How are you?';

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

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


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

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

strpos関数は正常に機能しますが、段落内の単語をcase-insensitive調べたいcase-insensitiveは、 PHP stripos関数を使用できPHP

例えば、

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

大文字小文字を区別しない部分文字列が文字列に最初に現れた位置を探します。

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


あなたが "偽"と "真実"の問題を避けたいのであれば、substr_countを使うことができます:

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

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


if (preg_match('/(are)/', $a)) {
   echo '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サンプル


strpos()関数を使うと、ある文字列の出現を別の文字列の中に見つけることができます:

$a = 'How are you?';

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

!== false使用は意図的なものであることに注意してください。 strpos()は、 strpos()文字列で針文字列が始まるオフセットか、needleが見つからない場合はboolean false返します。 0は有効なオフセットで0は "falsey"なので、 !strpos($a, 'are')ような簡単な構文を使うことはできません。


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

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

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

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

strposはインデックス値として0を返すことができるので、同一の/同一ではない演算子を使用する必要があります。 三項演算子が好きな人は、次のようにすることをお勧めします(ちょっと前に私が認めます)。

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

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

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

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


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

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

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

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

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

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

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

$a = 'How are you?';

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

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


文字列は以下の関数でチェックすることができます:

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

strposstrposなどの関数を使用したここでの回答は、 マルチバイト文字列関数についてはまだ触れていませんでした(2015-05-08)。

基本的に、ドイツ語、フランス語、ポルトガル語、スペイン語などの一部の言語固有の文字 (例: äéôçºñを持つ単語を見つけるのが難しい場合は、関数はmb_ 。 したがって、受け入れられた答えは、 mb_strposまたはmb_stripos (大文字と小文字を区別しない一致)を使用します。

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

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

なぜすべてのソフトウェア開発者が絶対最小限であるのかを理解するための良い記事は、 Joel Spolskyの Unicodeと文字セット(正当な理由はありません!


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

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

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

これらの答えのほとんどは、文字列に部分文字列が含まれているかどうかを示していますが、 部分文字列ではなく特定の単語を検索する場合は、通常は必要としません。

違いは何ですか? サブストリングは他の単語の中に現れます:

  • 「エリア」の冒頭の「are」は、
  • "hare"の終わりにある "are"
  • 「運賃」の真ん中の「are」は、

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

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

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

  • あなたは何を考えているのですか?
  • 「are are dunno wut are are4?」の「are」は?

これよりも正確なものを望むなら、英語の構文解析をやり始めなければならないでしょう。それはかなり大きなワームです(とにかく、必ずしも与え​​られているわけではない構文の適切な使用を前提としています)。


文字列に特定の単語が含まれていないか確認します

これは、文字列を単語に分解しなければならないことを意味します(下記の注を参照)。

セパレータを指定するには、 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の文字テーブルによって制御され、ロケール固有のマッチングが行われている場合は変更される可能性があります(..)


実際に別の単語の一部となる可能性のある一連の文字が出現するのではなく、「単語」を見つけるためには、次のことが良い解決策になります。

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

if (in_array('are', $array) ) {
    echo 'Found the word';
}

検索で大文字と小文字を区別しない場合は、 stristr() strstr()またはstristr()を使用すると別のオプションになります。


それは3つの異なる方法で行うことができます:

 $a = 'How are you?';

1-ストリスト()

 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
 }

ショートハンド版

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

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

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が含まれていることを伝えたい場合があります。





string-matching