2010-01-23 20 views
19

$string bir dizide ifade edilen öğelerden herhangi birini içeriyor mu?Dize bir dizi içinde herhangi bir öğe içeriyor (büyük harf duyarsız)

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

Herhangi bir fikir?

+0

Kontrol Çözümü [php adresinde yayınlanan dizenin dizide bir değer içerip içermediğini kontrol edin] (http://stackoverflow.com/a/40543118/4243217) – jitendrapurohit

cevap

11

istediğin bu mu? Ben o kod derleme :) umut

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

bu, aralarında en iyisi işe yaramaktadır :) – tarnfeld

+14

Bu, dizelerde başarısız olur: "Tom, sen ne düşünüyorsun?" "Onun adı Tom." diğerleri arasında. – hobodave

0

Bu iş yapacak mı?

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

Bu yalnızca tüm kelimelerle eşleşir. – apokryfos

74

Ne istediğini idare edecek yerleşik bir işlevi olduğunu sanmıyorum.

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

+1, gülünç bir şekilde karmaşık olma, normal ifadeler kullanma veya hepsini tek bir satırda sığdırmaya çalışmadığı için. – hobodave

+4

Neden regexp değil? Ben preg_match ('/'. Implode ('|', $ arr) yorumlamak için zor değil düşünüyorum. '/ I', $ str) – velop

+0

Güzel ve basit @velop :) Hangisi daha performanslı olduğunu merak ediyorum. – Jammer

3

şey çalışacak:

$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

Çok daha basit, kullanma linki in_array

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

Uh, belirli bir alt dizeyi bulmaya çalışması dışında, bir cümleyle. – Kzqai

+0

Tam olarak "in_array" ile eşleşiyorsunuz, doğru bir cevap değil. – nikoskip

10

bakınız kabul Kolayca ancak fonksiyonunu yazabiliriz cevap:

her elemana strtolower uygulamak için array_map kullanmak gerçekten gerekli değil çünkü

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 
} 

Sadece bir yan notif ifadesi olarak değiştirilebilir olabilirdi. bunun yerine ilk dizeye uygulayın. için

+0

+1 benim 3 yaşında kod için bazı iyileştirmeler yapmak ;-) – sbczk

+0

teşekkür ederim. Aslında benim ilk mesajım. Bir adam bir yerlere başlamak zorunda mı? ;) – kkonstantinov

+0

Bu (kabul edilen yanıtla birlikte) alt sözcüklerden ziyade tüm sözcüklerle eşleşir; dolayısıyla, sözcüklerin tamamından daha fazlasına eşleşmeniz gerekiyorsa, muhtemelen @zombat'ın yanıtını kullanmalısınız. – apokryfos

6

Bir daha geçici çözüm fonksiyonunu

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

PS içerir. bana gelince, ben sadece

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

Bu çözümü beğendim :) – Joel

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() fonksiyonu ile yapmanın bir başka yolu .. fonksiyonu olmadan kullanın ediyorum kodunun altına deneyin:

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; 
} 
İlgili konular