PHP Как проверить, существует ли (частично) одно из значений массива в строке? - PullRequest
4 голосов
/ 31 мая 2011

Должно быть просто, но не могу найти мой ответ.
Как проверить, содержится ли одно из значений в массиве в строке?
Вывод должен быть истинным или ложным.

$array = Array( 
   0 => 'word1',
   1 => 'word2',
   2 => 'New York'
   3 => 'New car' 
);

$string = "Its a sunny day in New York";

Пытаюсь уточнить. В этом случае массив [3] не должен совпадать. Только массив [2] должен быть.

Ответы [ 7 ]

2 голосов
/ 31 мая 2011

Функциональная замена для вашего in_array будет:

array_filter(
    array_map("strpos",  array_fill(0, count($words), $string), $words),
"is_int")
1 голос
/ 31 мая 2011

Метод грубой силы будет:

$words = implode('|', $array);

if (preg_match("/($words)/", $string, $matches)) {
    echo "found $matches[1]";
}
1 голос
/ 31 мая 2011

Обновление:

Независимым от границы слова решением было бы добавить пробелы вокруг входной строки и поисковых слов:

$str = ' ' . $str . ' ';


function quote($a) {
    return ' ' . preg_quote($a, '/') . ' ';
}

$word_pattern = '/' . implode('|', array_map('quote', $array)) . '/';

if(preg_match($word_pattern, $str) > 0) {

}

или циклически перебирая термины:

foreach($array as $term) {
    if (strpos($str, ' '. $term . ' ') !== false) {
        // word contained
    }
}

Оба могут быть помещены в функцию для упрощения использования, например,

function contains($needle, $haystack) {
    $haystack = ' ' . $haystack . ' ';
    foreach($needle as $term) {
       if(strpos($haystack, ' ' . $term . ' ') !== false) {
           return true;
       }
    }
    return false;
}

Посмотрите на DEMO


Старый ответ:

Вы можете использовать регулярные выражения:

function quote($a) {
    return preg_quote($a, '/');
}

$word_pattern = implode('|', array_map('quote', $array));

if(preg_match('/\b' . $word_pattern  . '\b/', $str) > 0) {

}

Важной частью являются граничные символы \b здесь. Вы получите совпадение только в том случае, если искомым значением является (последовательность) слово (а) в строке.

0 голосов
/ 31 мая 2011

Как то так?

$array = Array( 
   0 => 'word1',
   1 => 'word2',
   2 => 'word3'
);

$string = "there a good word3 here";

function findInArray($string, $array) {
    for ($x=0; $x < count($array); $x++) {
        if (preg_match('/\b' . $array[$x] . '\b/', $string)) { // The \b in the pattern indicates a word boundary, so only the distinct 
            return true;
        }
    }
    return false;
}

if (findInArray($string, $array)) {
   // do stuff
}
0 голосов
/ 31 мая 2011

Для этого вы можете выбрать функцию in_array: http://php.net/manual/en/function.in-array.php

if (in_array($value, $array))
{
echo $value . ' is in the array!';
}
0 голосов
/ 31 мая 2011
$array = Array( 
   0 => 'word1',
   1 => 'word2',
   2 => 'word3'
);

$string = "there a good word3 here";

foreach($array as $word)
{
    if(strstr($string, $word))
        echo "<b>$word</b> has been detected in <b>$string</b>";
}
0 голосов
/ 31 мая 2011
$array = Array( 
   0 => 'word1',
   1 => 'word3',
   2 => 'word3 basic',
   3 => 'good'
);

$string = "there a good word3 basic here";

//Convert the String to an array
$stringArray = explode(' ',$string);

//Loop the string
foreach($stringArray as $matchedWords) {
    if(in_array($matchedWords, $array )) {
        echo $matchedWords.'<br/>';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...