如何检查字符串是不是包含特定单词?

Posted

技术标签:

【中文标题】如何检查字符串是不是包含特定单词?【英文标题】:How do I check if a string contains a specific word?如何检查字符串是否包含特定单词? 【发布时间】:2011-05-20 23:38:51 【问题描述】:

考虑:

$a = 'How are you?';

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

假设我有上面的代码,那么语句if ($a contains 'are')的正确写法是什么?

【问题讨论】:

【参考方案1】:

您可以使用strpos() 函数来查找一个字符串在另一个字符串中的出现:

$a = 'How are you?';

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

请注意,使用!== false 是故意的(!= false=== true 都不会返回所需的结果); strpos() 返回针头字符串在 haystack 字符串中开始的偏移量,如果未找到针头,则返回布尔值 false。由于 0 是一个有效的偏移量,而 0 是“假”,我们不能使用像 !strpos($a, 'are') 这样更简单的构造。

现在使用 PHP 8,您可以使用 str_contains:

if (str_contains('How are you', 'are'))  
    echo 'true';

RFC

【讨论】:

@DTest - 是的,当然它会返回true,因为字符串包含'are'。如果您专门寻找 ARE 一词,则需要进行更多检查,例如检查 A 之前和 E 之后是否有字符或空格。 上面非常好的cmets!我从不使用 != 或 ==,毕竟 !== 和 === 是最佳选择(在我看来)所有方面(速度、准确性等)都考虑在内。 @jsherk 那么为什么不使用正则表达式呢?像“是”这样的东西。 至于不抓'care'之类的,最好检查一下 (strpos(' ' . strtolower($a) . ' ', ' are ') !== false) 我倾向于通过始终使用strpos($a, 'are') > -1 来测试是否为真来避免这个问题。从调试的角度来看,当我不必计算连续的等号时,我发现我的大脑在确定行是否正确写入时浪费的时钟周期更少。【参考方案2】:

正如其他用户所提到的,您可以使用正则表达式,因为与 strpos 相比,它更适合单词匹配。 strposare 的检查也将返回 true,例如:fare、care、stare 等。在正则表达式中使用单词边界可以简单地避免这些意外匹配。

are 的简单匹配可能如下所示:

$a = 'How are you?';

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

在性能方面,strpos 大约***倍。当我一次进行一百万次比较时,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

要将两组功能组合成一个多功能功能(包括可选择区分大小写),您可以使用以下内容:

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.

还有一点需要注意,\b 不能用于英语以外的其他语言。

The explanation for this and the solution is taken from here:

\b 表示单词的开头或结尾(单词边界)。这 正则表达式将匹配苹果派中的苹果,但不会匹配苹果中的苹果 菠萝、苹果车或烤苹果。

“咖啡馆”怎么样?我们如何在正则表达式中提取“café”这个词? 实际上,\bcafé\b 是行不通的。为什么?因为“咖啡厅”包含 非 ASCII 字符:é。 \b 不能简单地与 Unicode 一起使用,例如 समुद्र、감사、месяц 和?。

当你想提取Unicode字符时,你应该直接 定义代表单词边界的字符。

答案:(?<=[\s,.:;"']|^)UNICODE_WORD(?=[\s,.:;"']|$)

所以为了在php中使用答案,可以使用这个函数:

function contains($str, array $arr) 
    // Works in Hebrew and any other unicode characters
    // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed
    // Thanks https://www.phpliveregex.com/
    if (preg_match('/(?<=[\s,.:;"\']|^)' . $word . '(?=[\s,.:;"\']|$)/', $str)) return true;

如果你想搜索单词数组,你可以使用这个:

function arrayContainsWord($str, array $arr)

    foreach ($arr as $word) 
        // Works in Hebrew and any other unicode characters
        // Thanks https://medium.com/@shiba1014/regex-word-boundaries-with-unicode-207794f6e7ed
        // Thanks https://www.phpliveregex.com/
        if (preg_match('/(?<=[\s,.:;"\']|^)' . $word . '(?=[\s,.:;"\']|$)/', $str)) return true;
    
    return false;

从 PHP 8.0.0 开始,您现在可以使用 str_contains

<?php
    if (str_contains('abc', '')) 
        echo "Checking the existence of the empty string will always 
        return true";
    

【讨论】:

@Alexander.Plutov 第二个你给我的是-1而不是问题? cmon 谷歌搜索答案需要 2 秒 google.com/… +1 它是一种搜索简单字符串的可怕方式,但许多 SO 访问者正在寻找任何方式来搜索他们自己的任何子字符串,提出建议很有帮助向上。甚至 OP 也可能过于简单化了——让他知道他的替代方案。 从技术上讲,该问题询问如何查找 words 而不是子字符串。这实际上帮助了我,因为我可以将它与正则表达式单词边界一起使用。替代品总是有用的。 +1 表示答案,-1 表示 @plutov.by 评论,因为 strpos 只是一次检查,而 regexp 您可以同时检查多个单词 ex:preg_match(/are|you |不是/) 正则表达式应该是最后的手段。不鼓励在琐碎的任务中使用它们。我从多年挖掘不良代码的高度坚持这一点。【参考方案3】:

这里有一个小实用函数,在这种情况下很有用

// returns true if $needle is a substring of $haystack
function contains($needle, $haystack)

    return strpos($haystack, $needle) !== false;

【讨论】:

@RobinvanBaalen 其实可以提高代码的可读性。此外,反对票应该是针对(非常)糟糕的答案,而不是针对“中立”的答案。 @RobinvanBaalen 函数几乎按照可读性的定义(传达您正在做什么的想法)。比较哪个更具可读性:if ($email-&gt;contains("@") &amp;&amp; $email-&gt;endsWith(".com)) ...if (strpos($email, "@") !== false &amp;&amp; substr($email, -strlen(".com")) == ".com") ... @RobinvanBaalen 最后的规则是要被打破的。否则人们不会想出更新的创造性的做事方式:)。另外必须承认,我很难把注意力集中在像 martinfowler.com 这样的东西上。猜猜正确的做法是自己尝试并找出最方便的方法。 另一种观点:拥有一个可以轻松包装的实用函数可以帮助调试。此外,它还降低了对消除生产服务中此类开销的优秀优化器的呼声。所以所有的观点都有正确的观点。 ;) 这当然有用。你应该鼓励这样做。如果在 PHP 100 中有一种新的更快的方法来查找字符串位置会发生什么?你想改变你调用 strpos 的所有地方吗?还是您只想更改函数中的包含??【参考方案4】:

虽然这些答案中的大多数会告诉您字符串中是否出现子字符串,但如果您正在寻找特定的 word,而不是 substring。

有什么区别?子字符串可以出现在其他单词中:

“are”开头的“are” “野兔”结尾的“是” “票价”中间的“是”

缓解这种情况的一种方法是使用正则表达式和word boundaries (\b):

function containsWord($str, $word)

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

此方法没有上述相同的误报,但它确实有一些自己的边缘情况。单词边界匹配非单词字符 (\W),这将是不是 a-zA-Z0-9_ 的任何字符。这意味着数字和下划线将被视为单词字符,这样的场景将失败:

“你在想什么?”中的“是” “lol u dunno wut those are4?”中的“are”

如果您想要比这更准确的东西,您将不得不开始进行英语语法解析,这是一个相当大的蠕虫罐(并且假设正确使用语法,无论如何,这并不总是给定的) .

【讨论】:

这应该是规范的答案。因为我们正在寻找 words 而不是 substrings,所以正则表达式是合适的。我还要补充一点,\b 匹配 \W 不匹配的两个内容,这使得在字符串中查找 words 非常有用:它匹配字符串的开头 (^) 和结尾字符串 ($) 这应该是正确的答案.. 其余的答案将在类似“do you care”之类的字符串中找到“are”.. 正如@Dtest 所提到的 @RobertSinclair 有那么糟糕吗?如果你问我字符串“do you care”是否包含单词“are”,我会说“yes”。单词“are”显然是该字符串的子字符串。这是一个与“”“不同的问题”是“是”字符串“你在乎吗”“””中的一个词。 @Paulpro 尽管 OP 没有指定 $a 是一个短语,但我很确定它是隐含的。所以他的问题是如何检测短语中的单词。如果一个词里面包含一个词,我会认为这通常是无关紧要的。 @Jimbo 确实有效,您只是缺少了 `\` 3v4l.org/ZRpYi【参考方案5】:

要确定一个字符串是否包含另一个字符串,您可以使用 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,如果您进行 == 比较将无法正常工作,您将需要进行 ===

== 符号是一个比较,测试左边的变量/表达式/常量是否与右边的变量/表达式/常量具有相同的值。

=== 符号用于比较两个变量/表达式/常量是否相等 AND 具有相同的类型 - 即都是字符串还是整数。

【讨论】:

如果我使用“care”,它的返回值也是 true :(【参考方案6】:

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

【讨论】:

【参考方案7】:

如果您的搜索不区分大小写,则使用 strstr()stristr() 将是另一种选择。

【讨论】:

php.net/manual/en/function.strstr.php 页面上的注释:注意:如果您只想确定某个特定的针是否出现在 haystack 中,请改用更快且内存占用更少的函数 strpos()。 @tastro 在这方面有什么著名的基准吗? 这可能会更慢,但恕我直言strstr($a, 'are') 比丑陋的strpos($a, 'are') !== false 优雅得多。 PHP 真的需要一个str_contains() 函数。 这不是公认的答案让我大吃一惊【参考方案8】:

与 SamGoody 和 Lego Stormtroopr cmets 相媲美。

如果您正在寻找一种 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()

没有好处

在搜索单词之前可以选择消除冗余

从而减少索引大小并减少存储需求

更少的磁盘 I/O

更快的索引和因此更快的搜索。

1.标准化

将所有文本转换为小写

2。停用词消除

从文本中删除没有实际意义的单词(如“and”、“or”、“the”、“for”等)

3.字典替换

用具有相同或相似含义的其他单词替换。 (例如:将“饥饿”和“饥饿”的实例替换为“饥饿”)

可以执行进一步的算法措施(雪球),以进一步减少单词的基本含义。

将颜色名称替换为对应的十六进制数

通过降低精度来减少数值是标准化文本的其他方法。

资源

http://linuxgazette.net/164/sephton.html http://snowball.tartarus.org/ mysql Fulltext Search Score Explained http://dev.mysql.com/doc/internals/en/full-text-search.html http://en.wikipedia.org/wiki/Vector_space_model http://en.wikipedia.org/wiki/Tf%E2%80%93idf http://phpir.com/simple-search-the-vector-space-model/

【讨论】:

【参考方案9】:

通过stripos() 使用不区分大小写的匹配

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

【讨论】:

【参考方案10】:

如果要避免“假”和“真”的问题,可以使用substr_count:

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

它比 strpos 慢一点,但它避免了比较问题。

【讨论】:

它返回 false 表示“你确定吗?”因为strpos 的位置是0【参考方案11】:
if (preg_match('/(are)/', $a)) 
   echo 'true';

【讨论】:

我收到以下警告:WARNING preg_match(): Delimiter must not be alphanumeric or backslash【参考方案12】:

另一种选择是使用strstr() 函数。比如:

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

注意点:strstr() 函数区分大小写。对于不区分大小写的搜索,请使用 stristr() 函数。

【讨论】:

strstr() 如果没有找到针头,则返回 FALSE。所以不需要 strlen。【参考方案13】:

我有点印象深刻的是,这里使用strposstrstr 和类似功能的答案都没有提到Multibyte String Functions (2015-05-08)。

基本上,如果您在查找包含某些语言特定字符的单词时遇到困难,例如德语、法语、葡萄牙语、西班牙语等(例如:ä , é, ô, ç, º, ñ),你可能想要在函数前面加上mb_。因此,接受的答案将改用mb_strposmb_stripos(用于不区分大小写的匹配):

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

如果您不能保证all your data is 100% in UTF-8,您可能需要使用mb_ 函数。

一篇很好的文章来理解为什么是 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky

【讨论】:

【参考方案14】:

在 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 选择 strposstripos 来完成工作,具体取决于 $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)

【讨论】:

【参考方案15】:

你可以使用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 ";

【讨论】:

Crashes 如果您搜索第一个单词。【参考方案16】:

下面的函数也可以工作,并且不依赖于任何其他函数;它只使用原生 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 

【讨论】:

你能告诉我为什么你会使用这样的函数,而 strpos 是一个完美可行的解决方案?... @sg3s: 你说的很对,不过 strpos 也是基于类似的东西,另外,我发帖不是为了分享一点知识 最后一个 var_dump 为假 @Sunny:这是错字:var_dump(is_str_contain("mystringss", "strings")); //真【参考方案17】:

许多使用substr_count 的答案会检查结果是否为&gt;0。但由于if 语句将same as false 视为零,因此您可以避免该检查并直接写入:

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

要检查是否存在 ,请添加 ! 运算符:

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

【讨论】:

嗯...部分正确,在 php 中 0 == false 为 true,但 0 === false 为 false【参考方案18】:

我遇到了一些麻烦,最后我选择创建自己的解决方案。不使用regular expression引擎:

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开头 如果单词用逗号、问号或点链接,您的功能可能不起作用。例如“你所看到的就是你得到的。”并且您想确定句子中是否包含“get”。注意“get”旁边的句号。在这种情况下,您的函数返回 false。建议使用正则表达式或substr(我认为它无论如何都使用正则表达式)来搜索/替换字符串。 @lightbringer 你的推荐不能再错了,“推荐”对你意味着什么?没有至高无上的人推荐或认可。这是关于在 php 中使用正则表达式引擎,这是语言本身的一个黑洞,您可能想尝试将正则表达式匹配放在一个循环中并对结果进行基准测试。 这个答案的演示很差,并且在许多扩展场景中都失败了。我看不出娱乐这种技术有什么好处。这是经过改进的自定义函数和迭代调用:3v4l.org/E9dfD我没有兴趣编辑此 wiki,因为我发现它浪费研究人员的时间。【参考方案19】:

使用strstr() 和stristr() 从字符串中查找单词出现的另一种方法如下:

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

【讨论】:

这是倒退的。 stristr 中的 i 代表不敏感。【参考方案20】:

可以通过三种不同的方式完成:

 $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【参考方案21】:

简写版

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

【讨论】:

虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案22】:

如果您只想检查一个字符串是否包含在另一个字符串中,请不要使用preg_match()。请改用strpos()strstr(),因为它们会更快。 (http://in2.php.net/preg_match)

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

【讨论】:

【参考方案23】:

为了找到一个“单词”,而不是出现实际上可能是另一个单词的一部分的一系列字母,以下将是一个很好的解决方案。

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

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

【讨论】:

如果$stringAre are, are?,它将失败【参考方案24】:

您应该使用不区分大小写的格式,因此如果输入的值是smallcaps 则无关紧要。

<?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 在这里 没有 考虑大小写(小/大写)。

PHPCode Sample with output

【讨论】:

【参考方案25】:

也许你可以使用这样的东西:

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

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

【讨论】:

【参考方案26】:

如果你想检查字符串是否包含几个特定的​​单词,你可以这样做:

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

这对于在发送电子邮件时避免垃圾邮件很有用。

【讨论】:

【参考方案27】:

strpos 函数可以正常工作,但是如果你想在段落中检查一个单词的case-insensitive,那么你可以使用PHPstripos 函数。

例如,

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

else 
    // Word exists

查找不区分大小写的子字符串在字符串中第一次出现的位置。

如果字符串中不存在单词,则返回false,否则返回单词的位置。

【讨论】:

【参考方案28】:

可以使用以下函数检查字符串:

function either_String_existor_not($str, $character) 
    return strpos($str, $character) !== false;

【讨论】:

可以简化为return strpos($str, $character) !== false【参考方案29】:

您需要使用相同/不相同的运算符,因为 strpos 可以返回 0 作为它的索引值。如果您喜欢三元运算符,请考虑使用以下内容(我承认这似乎有点倒退):

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

【讨论】:

【参考方案30】:

检查字符串是否包含特定的单词?

这意味着必须将字符串解析为单词(请参阅下面的注释)。

执行此操作并指定分隔符的一种方法是使用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的字符控制 表,并且如果发生特定于区域设置的匹配可能会有所不同(..)

【讨论】:

以上是关于如何检查字符串是不是包含特定单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确检查字符串是不是不包含特定单词?

如何检查字符串是不是包含特定单词?

如何检查句子是不是包含特定单词?

如何使用 PHP switch 语句检查字符串是不是包含单词(但也可以包含其他单词)?

检查文件是不是存在以及是不是包含特定字符串

如何快速检查 url 字符串是不是包含一个单词?