Строка содержит любые элементы в массиве (без учета регистра) - PullRequest
24 голосов
/ 23 января 2010

Как я могу проверить, содержит ли $string какие-либо элементы, выраженные в массиве?

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

Есть идеи?

Ответы [ 10 ]

79 голосов
/ 23 января 2010

Я не думаю, что есть встроенная функция, которая будет обрабатывать то, что вы хотите. Вы можете легко написать функцию contains() однако:

function contains($str, array $arr)
{
    foreach($arr as $a) {
        if (stripos($str,$a) !== false) return true;
    }
    return false;
}
18 голосов
/ 23 января 2010

это то, что вы хотели? я надеюсь, что код компилируется:)

$string = 'My nAmE is Tom.';
$array = array("name","tom");
if(0 < count(array_intersect(array_map('strtolower', explode(' ', $string)), $array)))
{
  //do sth
}
11 голосов
/ 05 сентября 2013

Используя принятый ответ:

$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 к каждому элементу. вместо этого примените его к исходной строке.

7 голосов
/ 25 ноября 2015

Еще один обходной путь для функции содержит

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
}
3 голосов
/ 23 января 2010

Примерно так будет работать:

$string = 'My nAmE is Tom.';
$array = array("name", "tom");
foreach ($array as $token) {
    if (stristr($string, $token) !== FALSE) {
        print "String contains: $token\n";
    }
}
2 голосов
/ 22 июня 2016
<?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 голосов
/ 17 августа 2017

Еще один способ сделать с функцией 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;
}
0 голосов
/ 28 августа 2012

Намного проще, пожалуйста, обратитесь по ссылке in_array

$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
echo "Es Irix";
}
0 голосов
/ 23 января 2010
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'));
0 голосов
/ 23 января 2010

Будет ли это делать работу?

$words = explode(" ", $string);
$wordsInArray = array();
foreach($words as $word) {
    if(in_array($word, $array)) {
        $wordsInArray[] = $word;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...