2010-01-23 52 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; 
} 
相關問題