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

Php 字符串包含数组中的任何项(不区分大小写),php,string,arrays,contains,Php,String,Arrays,Contains,如何检查$string是否包含数组中表示的任何项 $string = 'My nAmE is Tom.'; $array = array("name","tom"); if(contains($string,$array)) { // do something to say it contains } 有什么想法吗?这样行吗 $words = explode(" ", $string); $wordsInArray = array(); foreach($words as $word) {

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

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(contains($string,$array))
{
// do something to say it contains
}
有什么想法吗?

这样行吗

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

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

$string='我叫汤姆';
$array=数组(“名称”、“tom”);
如果(0<计数(数组相交(数组映射('strtolower',explode('',$string)),$array)))
{
//做某事
}

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

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

类似这样的方法会奏效:

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

更简单,请参考链接


使用公认的答案:

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array)))
{
  //do sth
}
$string='我叫汤姆';
$array=数组(“名称”、“tom”);
如果(0<计数(数组相交(数组映射('strtolower',explode('',$string)),$array)))
{
//做某事
}
请注意,if语句可以更改为:

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

因为实际上没有必要使用数组映射将
strtolower
应用于每个元素。而是将其应用于初始字符串。

contains函数还有一个变通方法

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
}

使用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;
}

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

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

这将在字符串上失败:“Tom,你怎么看?”“他的‘名字’是Tom。”以及其他许多字符串。+1表示不太复杂,不使用正则表达式,也不试图将其全部放在一行中。为什么不使用正则表达式?我认为解释preg_match(“/”。内爆(“|”)、$arr.“/I”、$str)很好,很简单@develop:)我想知道哪一个性能更好。@develop虽然是一种有效的方法,但在功能上并不等同。考虑到通过正则表达式进行匹配,需要编写数组。否则,如果数组中的任何字符串包含a/or |或任何其他修饰符,它将提供意外的结果。使用Larvel的开发人员提示:从5.7开始,此方法在框架中以
Str::contains(string$haystack,array | string$niels)
stru-contains(string$haystack,array | string$niels)的形式存在
适用于5.6版。嗯,除了他试图在一个句子中找到特定的子字符串外。你正在寻找与数组中的
完全匹配的子字符串,这不是正确的答案。谢谢。实际上,我在这里的第一篇帖子。一个人必须从某个地方开始,对吗?;)这(连同被接受的答案)匹配的是整个单词而不是子字符串,所以如果你需要匹配更多的单词,你可能应该使用@zombat的答案。这只匹配整个单词。
if (strlen(str_replace($array, '', $string)) !== strlen($string)) {
    // do it
}
<?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);

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