回答:
strpos()
別の文字列内の1つの文字列の出現を見つけるために使用される関数を使用できます。
$a = 'How are you?';
if (strpos($a, 'are') !== false) {
echo 'true';
}
の使用!== false
は意図的なものであることに注意してください(望ましい結果が返されることもあり!= false
ません=== true
)。strpos()
針の文字列がhaystack文字列で始まるオフセット、またはfalse
針が見つからない場合はブール値を返します。0は有効なオフセットであり、0は「偽」であるため、などの単純な構成を使用することはできません!strpos($a, 'are')
。
strpos($a, 'are') > -1
真のテストに使用することでこの問題を回避する傾向があります。デバッグの観点から見ると、連続する等号を数える必要がないときに、脳が無駄にクロックサイクルを無駄にして、ラインが正しく記述されているかどうかがわかります。
正規表現を使用することもできます。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.
}
このような状況で役立つ小さなユーティリティ関数を次に示します
// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)
{
return strpos($haystack, $needle) !== false;
}
if ($email->contains("@") && $email->endsWith(".com)) { ...
か比較してください:またはif (strpos($email, "@") !== false && substr($email, -strlen(".com")) == ".com") { ...
これらの回答のほとんどは、部分文字列が文字列に出現するかどうかを示しますが、通常は、部分文字列ではなく特定の単語を探している場合は、これは望ましくありません。
違いは何ですか?部分文字列は他の単語内に現れることができます:
これを軽減する1つの方法は、単語の境界(\b
)と組み合わせた正規表現を使用することです。
function containsWord($str, $word)
{
return !!preg_match('#\\b' . preg_quote($word, '#') . '\\b#i', $str);
}
このメソッドには、上記と同じ誤検知はありませんが、独自のエッジケースがいくつかあります。単語の境界は、(非単語の文字に一致し\W
ないものであることを行っている、) 、a-z
、A-Z
、0-9
または_
。つまり、数字とアンダースコアは単語文字としてカウントされ、次のようなシナリオは失敗します。
これよりも正確なものが必要な場合は、英語の構文解析を開始する必要があります。これはかなり大きなワームの缶です(とにかく、常に正しいとは限らない構文の適切な使用を前提としています)。
\b
\W
^
$
文字列に別の文字列が含まれているかどうかを確認するには、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
、同じタイプを持っている-つまり、両方が文字列であるか、両方が整数です。
<?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.";
}
?>
strstr($a, 'are')
は醜いものよりはるかにエレガントですstrpos($a, 'are') !== false
。PHPには本当にstr_contains()
関数が必要です。
次を使用して、大文字と小文字を区別しない照合を利用しstripos()
ます。
if (stripos($string,$stringToSearch) !== false) {
echo 'true';
}
SamGoodyピアとLego Stormtrooprのコメント。
複数の単語の近接性/関連性に基づいて検索結果をランク付けするPHPアルゴリズムを探している場合、PHPのみで検索結果を生成する迅速かつ簡単な方法がここにあります。
他のブール検索方法の問題などstrpos()
、preg_match()
、strstr()
またはstristr()
Vector Space Modelとtf-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.ストップワードの削除
3.辞書の置換
単語を、同一または類似の意味を持つ他のものに置き換えます。(例:「ハングリー」と「ハングリー」のインスタンスを「ハンガー」に置き換える)
さらなるアルゴリズム的手段(雪だるま式)を実行して、単語をそれらの本質的な意味にさらに減らすことができる。
色の名前を16進数の色に置き換える
精度を下げることによる数値の削減は、テキストを正規化する他の方法です。
リソース
「偽り」と「真実」の問題を回避したい場合は、substr_countを使用できます。
if (substr_count($a, 'are') > 0) {
echo "at least one 'are' is present!";
}
strposより少し遅いですが、比較の問題を回避します。
false
ために、「あなたはよろしいですか?」位置は以降strpos
である0
別のオプションは、strstr()関数を使用することです。何かのようなもの:
if (strlen(strstr($haystack,$needle))>0) {
// Needle Found
}
注意点:strstr()関数は大文字と小文字を区別します。大文字と小文字を区別しない検索の場合は、stristr()関数を使用します。
if (preg_match('/(are)/', $a)) {
echo 'true';
}
WARNING preg_match(): Delimiter must not be alphanumeric or backslash
私は少し使用することをここに答えのいずれもが感動しないよstrpos
、strstr
と同様の機能が言及したマルチバイト文字列関数をまだ(2015年5月8日)。
基本的に、ドイツ語、フランス語、ポルトガル語、スペイン語など、一部の言語に固有の文字(例:ä、é、ô、ç、º、ñ)を含む単語を見つけるのに問題がある場合は、前に進むことをお勧めします。の機能mb_
。したがって、受け入れられた回答は、代わりにmb_strpos
またはmb_stripos
(大文字と小文字を区別しないマッチングの場合)を使用します。
if (mb_strpos($a,'are') !== false) {
echo 'true';
}
すべてのデータがUTF-8で100%であることを保証できない場合は、mb_
関数を使用することをお勧めします。
Joel SpolskyによるUnicodeと文字セット(言い訳なし!)について、絶対にすべてのソフトウェア開発者が絶対に最低限必要であることを理解するための良い記事です。
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)
以下の関数も機能し、他の関数に依存しません。ネイティブの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
関数を使用できます。
$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 ";
}
私はこれでいくつかの問題があり、最後に私は自分のソリューションを作成することを選びました。正規表現エンジンを使用しない場合:
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
。
$found = false
初めに
使用して文字列から単語の出現を見つけるための別のオプションは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
小文字を区別しないの略です。
substr_count
結果がであるかどうかのチェックを使用する多くの回答>0
。しかし、if
ステートメントはゼロをfalseと同じと見なすため、そのチェックを回避して直接書き込むことができます。
if (substr_count($a, 'are')) {
存在しないかどうかを確認するには、!
演算子を追加します。
if (!substr_count($a, 'are')) {
これは、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
}
簡略版
$result = false!==strpos($a, 'are');
あなたは、入力された値がでているのであれば、大文字小文字を区別しない形式を使用する必要があります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で針を見つけます。
多分あなたはこのようなものを使うことができます:
<?php
findWord('Test all OK');
function findWord($text) {
if (strstr($text, 'ok')) {
echo 'Found a word';
}
else
{
echo 'Did not find a word';
}
}
?>
preg_match()
ある文字列が別の文字列に含まれているかどうかを確認するだけの場合は使用しないでください。彼らがより速くなるようにstrpos()
またはstrstr()
代わりに使用してください。(http://in2.php.net/preg_match)
if (strpos($text, 'string_name') !== false){
echo 'get the string';
}
文字列にいくつかの特定の単語が含まれているかどうかを確認する場合は、次のようにできます。
$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";
}
これは、たとえばメールを送信するときにスパムを回避するのに役立ちます。
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を返し、それ以外の場合は単語の位置を返します。
文字列に特定の単語が含まれているかどうかを確認しますか?
これは、文字列を単語に解決する必要があることを意味します(下記の注を参照)。
これを行い、セパレーターを指定する1つの方法は、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');
?>
実行すると
$ 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の文字テーブルによって制御され、ロケール固有のマッチングが行われている場合(..)