2010-01-23 179 views
19

如何检查$string是否包含数组中表达的任何项目?字符串包含数组中的任何项(不区分大小写)

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

任何想法?

+0

检查解决方案发布在[PHP检查字符串是否包含数组中的值](http://stackoverflow.com/a/40543118/4243217) – jitendrapurohit 2016-11-11 08:35:10

回答

11

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

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

这似乎是最好的,他们之间:) – tarnfeld 2010-01-23 20:33:00

+14

这将失败的字符串:“汤姆,你有什么想法?” “他的名字是汤姆。”等等。 – hobodave 2010-01-24 04:52:24

0

这会做这份工作吗?

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

这只能匹配整个单词。 – apokryfos 2015-10-16 09:17:52

74

我不认为有一个内置函数可以处理你想要的。你可以很容易地写。然而功能:

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

+1不是很可笑的复杂,使用正则表达式,或试图将它全部放在一行中。 – hobodave 2010-01-24 04:55:04

+4

为什么不是正则表达式?我认为它不会diffucult来解释preg_match('/'。implode('|',$ arr)。'/ i',$ str) – velop 2015-04-01 08:50:52

+0

不错和简单的@开发:)我不知道哪一个更高性能。 – Jammer 2016-09-30 10:29:31

3

像这样的工作:

$string = 'My nAmE is Tom.'; 
$array = array("name", "tom"); 
foreach ($array as $token) { 
    if (stristr($string, $token) !== FALSE) { 
     print "String contains: $token\n"; 
    } 
} 
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')); 
-3

简单得多,请参阅链接in_array

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

呃,除了他试图找到特定的子字符串 - 在一个句子中。 – Kzqai 2012-10-18 19:32:27

+0

您正在用'in_array'查找精确匹配,这不是正确的答案。 – nikoskip 2014-12-23 13:43:54

10

使用接受回答:

因为它是不是真的有必要使用array_map申请 strtolower给每个元素

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

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

只是一个侧面说明了if语句可能被更改为。而是将其应用于初始字符串。对于

+0

+1对我3年的旧代码进行一些改进;-) – sbczk 2013-10-28 19:47:34

+0

谢谢。实际上,我的第一篇文章就在这里。一个人必须从某处开始吧? ;) – kkonstantinov 2013-10-31 17:24:19

+0

这个(连同接受的答案)匹配整个单词而不是子字符串,所以如果你需要匹配多于整个单词,你应该使用@zombat的答案。 – apokryfos 2015-10-16 09:16:39

6

还有一个解决办法包含功能

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 
} 
+0

我喜欢这个解决方案:) – Joel 2016-05-20 11:33:21

1
<?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); 

?> 
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; 
} 
相关问题