字符串包含数组中的任何项目(不区分大小写)

Posted

技术标签:

【中文标题】字符串包含数组中的任何项目(不区分大小写)【英文标题】:String contains any items in an array (case insensitive) 【发布时间】:2011-01-08 15:11:36 【问题描述】:

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

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

// do something to say it contains

有什么想法吗?

【问题讨论】:

没有指示是否需要部分单词匹配。你需要单词边界吗? 【参考方案1】:

有更简单的方法

   $string = 'My nAmE is Tom.';
   $convert=explode(" ",$string,5);
   if(in_array("My", $convert))

      echo "Ja";
   else

      echo "Nein";
   

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

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

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

    **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

【讨论】:

【参考方案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

【讨论】:

不错的解决方案。对于 utf8 字符,我更喜欢 mb_strtolower。【参考方案4】:

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;

【讨论】:

【参考方案5】:
<?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);

?>

【讨论】:

【参考方案6】:

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

function contains($string, $array, $caseSensitive = true)

    $stripedString = $caseSensitive ? str_replace($array, '', $string) : str_ireplace($array, '', $string);
    return strlen($stripedString) !== strlen($string);

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

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

【讨论】:

【参考方案7】:

使用公认的答案:

$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 应用于每个元素。而是将其应用于初始字符串。

【讨论】:

谢谢。实际上,我在这里的第一篇文章。一个人必须从某个地方开始,对吗? ;) 这(连同接受的答案)匹配整个单词而不是子字符串,因此如果您需要匹配的不仅仅是整个单词,您可能应该使用@zombat 的答案。【参考方案8】:

更简单,请参考链接in_array

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

【讨论】:

呃,除了他试图找到特定的子串——在一个句子中——。 您正在寻找与in_array 完全匹配的结果,这不是正确答案。【参考方案9】:
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'));

【讨论】:

【参考方案10】:

这样的事情会起作用:

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

【讨论】:

【参考方案11】:

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

function contains($str, array $arr)

    foreach($arr as $a) 
        if (stripos($str,$a) !== false) return true;
    
    return false;

【讨论】:

+1 表示没有非常复杂,使用正则表达式,或者试图将所有内容放在一行中。 为什么不用正则表达式?我认为解释 preg_match('/'.implode('|', $arr).'/i', $str) 并不难 漂亮而简单的@velop :) 我想知道哪个性能更好。 @velop 虽然是一种有效的方法,但在功能上并不等效。考虑到通过正则表达式匹配,需要编写数组。否则,如果数组中的任何字符串包含 / 或 |或任何其他修饰符,它会提供意想不到的结果。 对使用 Laravel 的开发人员的提示:从 5.7 开始,此方法在框架中以 Str::contains(string $haystack, array|string $needles) 存在,在 5.6 版本中以 str_contains(string $haystack, array|string $needles) 存在。 laravel.com/docs/8.x/helpers#method-str-contains【参考方案12】:

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

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

  //do sth

【讨论】:

这在字符串上会失败:“汤姆,你觉得呢?” “他的‘名字’是汤姆。”等等。【参考方案13】:

这样可以吗?

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

【讨论】:

这只匹配整个单词。

以上是关于字符串包含数组中的任何项目(不区分大小写)的主要内容,如果未能解决你的问题,请参考以下文章

PHP 数组中的PHP搜索字符串 - 不区分大小写

数组中的PHP搜索字符串-不区分大小写

不区分大小写的操作

如何从任何对象键中过滤不区分大小写的对象数组

按字母顺序排序arraylist(不区分大小写)

不区分大小写的数组查询Flask-SQLAlchemy