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

Charles Yeung 2666 php string substring contains string-matching

考虑:

$a = 'How are you?';

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

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

codaddict.. 5919

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

$a = 'How are you?';

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

注意使用!== false是故意的; strpos()返回针字符串在haystack字符串中开始的偏移量,false如果未找到针,则返回布尔值.由于0是有效偏移量而0是"假",因此我们不能使用更简单的结构!strpos($a, 'are').

  • @Darknight:使用时,"0"不被视为"假"!==.只考虑使用!=. (423认同)
  • 聚会很晚,但要小心这一点.对于"你关心吗?"字符串,这也会返回true (184认同)
  • 我找到的一件事是,如果"是"是第一个单词,那么上面的代码将失败,因为它返回"0",这可以被认为是假的!为了避免这种情况,它应该读取(strpos("x".$ a,'are')!== false)..... (158认同)
  • @DTest - 当然它会返回true,因为字符串包含'are'.如果您正在寻找单词ARE,那么您需要进行更多检查,例如,检查A之前和之后是否有字符或空格. (118认同)
  • 上面的评论非常好!毕竟我从不使用!=或==!==和===是最佳选择(在我看来)所考虑的所有方面(速度,准确度等). (31认同)
  • @jsherk为什么不用正则表达式呢?像"是"的东西. (6认同)
  • 至于没有捕捉'关心'和这样的事情,最好检查(strpos(''.strtolower($ a).'','are')!== false) (6认同)
  • 我倾向于通过总是使用`strpos($ a,'are')> -1来测试true来避免这个问题.从调试的角度来看,我发现当我不必计算连续的等号时,我的大脑会浪费更少的时钟周期来确定线路是否正确写入. (6认同)
  • @Wouter Padding with spaces并搜索`"are"`不是解决方案,因为它不一定是空格(例如``"你是."`) (5认同)
  • @Guiulio:正则表达式更慢:)如果你只需要检查它是否存在,以任何方式(所以'是'或'关心'无关紧要),然后使用基本功能以获得更好的性能 (3认同)
  • @EchtEinfachTV该函数总是返回false或postion但从不真实 (3认同)
  • @EchtEinfachTV尝试`strpos($ a,'are')=== false`.`===`是`!==`的补充运算符. (3认同)
  • @Melsi无论你使用比较(`===`)还是没有(`==`)类型检查,与事实有什么关系呢?你是否建议,`===`比`=='更快?我怀疑...... (3认同)
  • 为什么不简单地`if(strpos($ a,'are')> -1){// found} else {// not found} (3认同)
  • 在我的职业生涯中,我已经有数百次这个具体的答案了,每次看到它,我的大脑都会受伤.看到这个问题已被观看250万次,我们可以将示例更改为"$ subject ='你好吗?'; $ query ='are'; if(strpos($ subject,$ query)!==假)...`.不用担心,如果没有,它已被观看250万次也可能是不改变它的好理由.我也选择`return true`而不是'echo'true'.但我知道这真的开始偏离这个问题了. (3认同)
  • 最好的方法是`if((strpos($ form_email,'@')=== false)||(strpos($ form_email,'.')=== false)){$ error ='无效的电子邮件<br>' ; }` (2认同)
  • 我想检查字符串是否*不包含单词.我试图将false更改为true`if(strpos($ a,'are')!== true){...}`但它不起作用.相反,我现在正在使用:`if(!(strpos($ a,'are')!== false)){...}`看起来很尴尬.任何人? (2认同)
  • @DTest是对的.我不想成为"那个家伙",但这个答案是不完整的还是**问题应该改写**而不指定它正在寻找"单词"^^ U (2认同)

Breezer.. 511

您可以使用正则表达式,与其他用户提到的strpos相比,它更适合单词匹配,对于诸如票价,关心,凝视等字符串也会返回true.这可以通过使用单词边界在正则表达式中简单地避免.

一个简单的匹配可能看起来像这样:

$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的解释

  • 从技术上讲,问题是如何找到**字**而不是子字符串.这实际上帮助了我,因为我可以使用正则表达式边界.替代品总是有用的. (64认同)
  • +1这是一种搜索简单字符串的可怕方式,但很多SO的访问者正在寻找任何方法来搜索他们自己的子字符串,并且提出建议是有帮助的.甚至OP也可能过于简单 - 让他知道他的替代方案. (59认同)
  • 答案为+1,@ plutov.by评论为-1,因为strpos只是一次检查,同时regexp你可以在同一时间检查多个单词ex:preg_match(/ are | you | not /) (14认同)
  • @ Alexander.Plutov第二个你给我一个-1而不是问题?cmon需要2秒才能获得答案http://www.google.com/search?btnG=1&pws=0&q=find+word+in+string+php (9认同)
  • 正则表达式应该是最后的方法.应该不鼓励他们在琐碎的任务中使用它们.我从多年来挖掘糟糕代码的高度坚持这一点. (4认同)
  • 无论如何,这条评论完全丢失了:`preg_match`在你需要在`json_decode`之前检查`json` request的结果(它是否包含`error` word?)时有效.`strpos`对我不起作用. (2认同)
  • 如果`$ a ='计算机硬件',我希望它在寻找`are`时返回`false`.然而,在这种情况下,它返回true.你怎么做才能找到整个单词??? (2认同)
  • 正则表达式应该是''/\bare\b /'`.`\ b`是单词边界的标记,因此这个正则表达式与'hardware'不匹配. (2认同)

ejunker.. 222

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

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

  • @RobinvanBaalen实际上,它可以提高代码的可读性.此外,downvotes应该是(非常)坏的答案,而不是"中性"答案. (69认同)
  • @RobinvanBaalen函数几乎是为了可读性而定义的(传达你正在做的事情的想法).比较哪个更具可读性:`if($ email-> contains("@")&& $ email-> endsWith(".com)){...`或`if(strpos($ email,"@")! == false && substr($ email,-strlen(".com"))==".com"){...` (30认同)
  • 当然这很有用.你应该鼓励这个.如果在PHP 100中有一种新的更快的方法来查找字符串位置会发生什么?你想改变你所谓的strpos的所有地方吗?或者你想只改变函数内的包含? (13认同)
  • 另一种观点:拥有一个可以轻松包装的实用程序功能可以帮助调试.此外,它还为优秀的优化者提供了呐喊,从而消除了生产服务中的这种开销.所以所有意见都有效.;) (5认同)
  • @RobinvanBaalen in the end rules are meant to be broken. Otherwise people wouldn't come up with newer inventive ways of doing things :) . Plus have to admit I have trouble wrapping the mind around stuff like on martinfowler.com. Guess the right thing to do is to try things out yourself and find out what approaches are the most convenient. (3认同)
  • @RobinvanBaalen _"编写除了提高可读性之外什么都不做的功能是非常糟糕的"_这取决于.这不是最好的例子,但如果你维护别人的代码,它可能会有所帮助. (2认同)

FtDRbwLXw6.. 123

虽然这些答案中的大多数都会告诉您字符串中是否出现子字符串,但如果您要查找特定单词而不是字符串,则通常不是您想要的.

有什么不同?子字符串可以出现在其他词语中:

  • "区域"开头的"是"
  • "野兔"结束时的"是"
  • "票价"中间的"是"

减轻这种情况的一种方法是使用与单词边界(\b)相结合的正则表达式:

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

这种方法没有上面提到的相同误报,但它确实有一些自己的边缘情况.单词边界匹配非单词字符(\W),这将是任何不是a-z,A-Z,0-9,或_.这意味着数字和下划线将被计为单词字符,这样的场景将失败:

  • "你在想什么?"中的"是"?
  • "是谁"中的"大声笑",那些是4?

如果你想要比这更精确的东西,你将不得不开始进行英语语法语法分析,这是一个非常大的蠕虫(并假设正确使用语法,无论如何,这并不总是给定).

  • 这应该是规范的答案.因为我们正在寻找_words_而不是_substrings_,所以正则表达式是合适的.我还要补充说`\ b`匹配'\ W`没有的两个东西,这使得它很适合在字符串中查找_words_:它匹配字符串的开头(`^`)和字符串的结尾(`$ `) (23认同)

Jose Vega.. 105

要确定字符串是否包含另一个字符串,可以使用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,如果您进行的==比较不起作用,则需要执行===

==符号是比较和试验可变/表达/常数向左是否具有相同的值作为变量/表达/恒定到右侧.

一个===标志是一个比较,看两个变量/ expresions /常量是否相等AND具有相同类型的-即两个都是字符串或都是整数.

  • 引用来源?http://www.maxi-pedia.com/string+contains+substring+PHP (2认同)

Haim Evgi.. 58

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


glutorange.. 57

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

  • http://php.net/manual/en/function.strstr.php页面上的注释:注意:如果您只想确定特定针是否出现在haystack中,请使用速度更快且内存不足的函数strpos()代替. (8认同)

RafaSashi.. 42

同意SamGoody和Lego Stormtroopr的评论.

如果您正在寻找基于多个单词的邻近度/相关性搜索结果进行排名的PHP算法,那么只需使用PHP即可快速简便地生成搜索结果:

与其他布尔搜索方法,如问题strpos(),preg_match(),strstr()stristr()

  1. 无法搜索多个单词
  2. 结果没有任何结果

基于向量空间模型tf-idf(术语频率 - 逆文档频率)的 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.字典替换

  • 将词语替换为具有相同或相似含义的其他词语.(例如:用'饥饿'代替'饥饿'和'饥饿'的例子)

  • 可以执行进一步的算法测量(滚雪球)以进一步将单词减少到其本质含义.

  • 用十六进制等效替换颜色名称

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

资源


Shankar Damo.. 41

使用不区分大小写匹配使用stripos():

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


Alan Piralla.. 39

如果你想避免"假"和"真理"问题,你可以使用substr_count:

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

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


YashG99.. 31

另一种选择是使用strstr()函数.就像是:

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

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


Armfoot.. 28

我有点印象,这里没有使用的答案strpos,strstr类似的功能提到了多字节字符串函数(2015-05-08).

基本上,如果您在查找某些语言特有的字词时遇到问题,例如德语,法语,葡萄牙语,西班牙语等(例如:ä,é,ô,ç,º,ñ),您可能需要先于功能与mb_.因此,接受的答案将使用mb_strposmb_stripos(对于不区分大小写的匹配):

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

如果您无法保证所有数据都是100%UTF-8,则可能需要使用这些mb_功能.

一篇很好的文章,了解为什么绝对最低限度每个软件开发人员必须知道关于Unicode和字符集(没有借口!)Joel Spolsky.


joan16v.. 27

if (preg_match('/(are)/', $a)) {
   echo 'true';
}

  • 我收到以下警告:`警告preg_match():分隔符不能是字母数字或反斜杠 (3认同)

Jason OOO.. 23

以下功能也有效,不依赖于任何其他功能; 它仅使用本机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是一个完全可行的解决方案?... (13认同)
  • @ sg3s:你是完全正确的,然而,strpos也基于这样的东西,而且,我没有发布它代表只是为了分享一点知识 (3认同)

John Slegers.. 22

在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)


Decebal.. 21

我遇到了一些麻烦,最后我选择创建自己的解决方案.不使用正则表达式引擎:

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.


Arshid KV.. 21

你可以使用这个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](http://stackoverflow.com/a/12804233/1677209)如果您搜索第一个单词. (2认同)

Sadikhasan.. 16

使用strstr()stristr()从字符串中查找单词出现的另一个选项如下所示:

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


Somwang Souk.. 14

简易版

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

  • 虽然此代码段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量.请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因. (5认同)

DJC.. 14

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

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

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

  • 如果`$ string`是`是,是吗?`它将会失败 (5认同)

Pratik C Jos.. 13

您应该使用大小写不敏感的格式,因此如果输入的值在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在heystack中找到针,而不考虑案例(小/帽).

带输出的PHPCode样品


用户甲.. 13

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

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


T30.. 13

substr_count如果结果是,使用检查的很多答案>0.但由于if语句将false视为false,因此可以避免直接检查和写入:

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

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

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


用户甲.. 12

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

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

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


Vinod Joshi.. 11

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

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


Julien.. 10

如果要检查字符串是否包含多个特定单词,您可以执行以下操作:

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

例如,这有助于在发送电子邮件时避免垃圾邮件.


Shapeshifter.. 9

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

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


Akshay Khale.. 9

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,否则它将返回该单词的位置.


mvw.. 8

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

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

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


M Razwan.. 8

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

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


devpro.. 5

特定字符串的另一种解决方案:

$subject = 'How are you?';
$pattern = '/are/';
preg_match($pattern, $subject, $match);
if ($match[0] == 'are') {
    echo true;
}

你也可以使用strpos()功能.


用户甲.. 5

使用:

$text = 'This is a test';
echo substr_count($text, 'is'); // 2

// So if you want to check if is exists in the text just put
// in a condition like this:
if (substr_count($text, 'is') > 0) {
    echo "is exists";
}


用户甲.. 5

一个更简单的选择:

return ( ! empty($a) && strpos($a, 'are'))? true : false;


提问时间:

查看次数:

4103181 次

最近活跃:

7 月 前