String包含数组中的所有项(不区分大小写)

时间:2010-01-23 20:14:54

标签: php string arrays contains

如何检查$string是否包含数组中表达的任何项目?

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(contains($string,$array))
{
// do something to say it contains
}

有什么想法吗?

12 个答案:

答案 0 :(得分:79)

我认为没有内置函数可以处理你想要的东西。您可以轻松编写contains()函数:

function contains($str, array $arr)
{
    foreach($arr as $a) {
        if (stripos($str,$a) !== false) return true;
    }
    return false;
}

答案 1 :(得分:17)

是你想要的吗?我希望代码正在编译:)

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array)))
{
  //do sth
}

答案 2 :(得分:11)

使用接受的答案:

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array)))
{
  //do sth
}

请注意,if语句可以更改为:

if(0 < count(array_intersect(explode(' ', strtolower($string)), $array)))

因为没有必要使用array_map将strtolower应用于每个元素。而是将它应用于初始字符串。

答案 3 :(得分:7)

包含函数的另一种解决方法

function contains($string, $array, $caseSensitive = true)
{
    $stripedString = $caseSensitive ? str_replace($array, '', $string) : str_ireplace($array, '', $string);
    return strlen($stripedString) !== strlen($string);
}

PS。至于我,我只是在没有功能的情况下使用它..

if (strlen(str_replace($array, '', $string)) !== strlen($string)) {
    // do it
}

答案 4 :(得分:3)

这样的事情会起作用:

$string = 'My nAmE is Tom.';
$array = array("name", "tom");
foreach ($array as $token) {
    if (stristr($string, $token) !== FALSE) {
        print "String contains: $token\n";
    }
}

答案 5 :(得分:3)

我们可以检查给定字符串中是否存在数组的任何元素。

$string = 'My nAmE is Tom.';
$array = array("name","tom");

if(str_replace($array, '', strtolower($string)) !== strtolower($string)) {
   // If String contains an element from array      
   // Do Something
}

答案 6 :(得分:2)

<?php

$input = preg_quote('blu', '~'); // don't forget to quote input string!
$data = array('orange', 'blue', 'green', 'red', 'pink', 'brown', 'black');

$result = preg_grep('~' . $input . '~', $data);
print_r($result);

?>

答案 7 :(得分:0)

这会完成这项工作吗?

$words = explode(" ", $string);
$wordsInArray = array();
foreach($words as $word) {
    if(in_array($word, $array)) {
        $wordsInArray[] = $word;
    }
}

答案 8 :(得分:0)

function contains($str, $arr)
{
  $ptn = '';
  foreach ($arr as $s) {
    if ($ptn != '') $ptn .= '|';
    $ptn .= preg_quote($s, '/');
  }
  return preg_match("/$ptn/i", $str);
}

echo contains('My nAmE is Tom', array('name', 'tom'));

答案 9 :(得分:0)

使用array_intersect()函数的另一种方法,请尝试以下代码:

function checkString(array $arr, $str) {

  $str = preg_replace( array('/[^ \w]+/', '/\s+/'), ' ', strtolower($str) ); // Remove Special Characters and extra spaces -or- convert to LowerCase

  $matchedString = array_intersect( explode(' ', $str), $arr);

  if ( count($matchedString) > 0 ) {
    return true;
  }
  return false;
}

答案 10 :(得分:0)

我做了一些测试,因为我需要根据我们不允许的单词列表检查用户输入。

我发现将所有内容都转换为小写(因为我的列表是小写)然后使用数组相交是迄今为止最快的。

    **First Option I Tested**
    $tempString= explode(' ',strtolower($string));
    $foundWords = array_intersect($tempString,$profanities);
    Time taken: 0.00065207481384277 

    **The second option I tested**
    $tempWords = explode(' ',$words);
    foreach ($tempWords as $word)
    {
        foreach ($profanities as $profanity)
        {
            if (stripos($word,$profanity) !== false) return true;
        }
    }
    Time Taken: 0.024131059646606

答案 11 :(得分:-3)

更简单,请参阅链接in_array

$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Es Irix";
}