在字符串中查找多个单词

时间:2017-10-12 13:47:30

标签: php

我想在字符串中搜索多个单词。我目前有以下情况。这看起来非常笨重和丑陋。有没有更好的方法呢?

if (isset($myVar) && $myVar && strpos($myVar, 'foo') === false && strpos($myVar, 'bar') === false && strpos($myVar, 'steve') === false && strpos($myVar, 'one') === false && strpos($myVar, 'jobs') === false && strpos($myVar, 'dog') === false && strpos($myVar, 'blue') === false && strpos($myVar, 'cloud') === false && strpos($myVar, 'apple') === false)
    {

    // words do not exists in string

    }
  else
    {

    // words do not exists in string

    }

6 个答案:

答案 0 :(得分:1)

就像@ j08691所说的那样,构建一个搜索词的数组然后遍历它。

<?php

    $words = array ( 'foo', 'bar', 'steve' );
    $x=0;

    do {

        $found = strpos($myVar, $words[$x]);
        $x++;

    } while ($found !== false);


    if ($found !== false) {
        echo 'has all';
    }
    else {
        echo 'words do not exists in string';
    }

答案 1 :(得分:1)

策略1,使用循环:

您可以遍历包含所有单词的数组,并逐个执行strpos。这基本上与您当前的解决方案相同,但如果您有很多单词并且更容易维护和扩展更多单词,则不那么繁琐。

$words = array('foo', 'bar', 'steve', 'one', 'jobs', 'dog', 'blue', 'cloud', 'apple');
$match = false;
foreach ($words as $word) {
    if (strpos($myVar, $word) !== false) {
        $match = true;
        break;
    }
}
if ($match) {
    // ...
} else {
    // ...
}

您可以将其分解为通用函数以供重用

function str_contains($haystack, $needles, $mode = 'or') {
    foreach ($words as $word) {
        if (strpos($myVar, $word) !== false) {
            if ($mode == 'or') {
               return true;
            }
        } else {
            if ($mode == 'and') {
                return false;
            }
        }
    }
    return $mode == 'or' ? false : true;
}

$words = array(...);
if (str_contains($myVar, $words)) {
    // one of your words are included
} else {
   // none of your words are included
}
if (str_contains($myVar, $words, 'and')) {
    // all of your words are included
} else {
    // at least one of your words are not included
}

策略2,使用正则表达式:

或者,您可以创建正则表达式并使用preg_match

执行此操作
$words = array('foo', 'bar', 'steve', 'one', 'jobs', 'dog', 'blue', 'cloud', 'apple');
if (preg_match('/(' . implode('|', $words) . ')/', $myVar)) {
    // match
} else {
    // no match
}

答案 2 :(得分:0)

你可以使用preg_match()并将这些单词作为文字正则表达式传递,就像这样

    if (isset($myVar) && $myVar && (preg_mach("(foo|bar|fooo)", $myVar) === 1)) {
//do somthing
} else {
//do something else
}

答案 3 :(得分:0)

$words_to_search = ["wordA", "wordB", "wordC"];
foreach($words_to_search as $word){
    if(strpos($myVar, "$word"){
        //Exists
    } else{
        //Doesn't
    }
}

答案 4 :(得分:0)

您可以使用preg_match:

 if(preg_match('(bad|naughty)', $data) === 1) {
//TO DO
  }

我希望它有所帮助。

答案 5 :(得分:0)

您可以使用array_intersect()函数检查数组中的某些内容是否在另一个数组中找到。

$words = ['foo', 'bar', 'steve'];

if (array_intersect($words, explode(' ', $myVar))) {
    // Exists
}