php url ワイルド カード




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

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

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

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

検討してください:

$a = 'How are you?';

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

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


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)

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

echo FALSE === strpos($a,'are') ? 'false': '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を返し、そうでなければ単語の位置を返します。


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

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

$a = 'How are you?';

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

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


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

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

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

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

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


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

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

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

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

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

それは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
 }

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

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

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

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

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

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

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


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

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

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

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

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

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


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

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

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


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

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


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

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

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

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






string-matching