Сравнить строку с массивом строк в PHP? - PullRequest
2 голосов
/ 17 января 2012

У меня есть строка типа abcdefg123hijklm.У меня также есть массив, который содержит несколько строк.Теперь я хочу проверить мой abcdefg123hijklm и посмотреть, есть ли в массиве 123 из abcdefg123hijklm.Как я могу это сделать?Я думаю, in_array() не будет работать?

Спасибо?

Ответы [ 4 ]

11 голосов
/ 17 января 2012

Итак, вы хотите проверить, есть ли какая-либо подстрока этой конкретной строки (давайте назовем ее $searchstring) в массиве?Если это так, вам нужно будет перебрать массив и проверить подстроку:

foreach($array as $string)
{
  if(strpos($searchstring, $string) !== false) 
  {
    echo 'yes its in here';
    break;
  }
}

См .: http://php.net/manual/en/function.strpos.php

Если вы хотите проверить, находится ли определенная часть строки вмассив, который вам нужно будет использовать substr(), чтобы отделить эту часть строки, а затем используйте in_array(), чтобы найти его.

http://php.net/manual/en/function.substr.php

8 голосов
/ 11 июня 2013

Другим вариантом будет использование регулярных выражений и развертывание, например:

if (preg_match('/'.implode('|', $array).'/', $searchstring, $matches))
    echo("Yes, the string '{$matches[0]}' was found in the search string.");
else
    echo("None of the strings in the array were found in the search string.");

Это немного меньше кода, и я ожидаю, что он будет более эффективным для больших строк или массивов поиска, так какСтрока поиска должна быть проанализирована только один раз, а не один раз для каждого элемента массива.(Хотя вы добавляете накладные расходы на имплозу.)

Единственным недостатком является то, что он не возвращает индекс массива совпадающей строки, поэтому цикл может быть лучшим вариантом, если вам это нужно.Однако вы также можете найти его с помощью приведенного выше кода, за которым следует

$match_index = array_search($matches[0], $array);

Редактировать: обратите внимание, что это предполагает, что вы знаете, что ваши строки не будут содержать специальных символов регулярного выражения.Для чисто буквенно-цифровых строк, таких как ваши примеры, это будет правдой, но если у вас будут более сложные строки, вам придется сначала их избежать.В этом случае другое решение, использующее цикл, вероятно, будет проще.

2 голосов
/ 12 июня 2013

Вы можете сделать это наоборот. Предположим, что ваша строка $ string, а массив $ array.

foreach ($array as $value)
{
    // strpos can return 0 as a first matched position, 0 == false but !== false
    if (strpos($string, $value) !== false)
    {
        echo 'Matched value is ' . $value;
    }  
} 
1 голос
/ 10 июля 2014

Используйте это, чтобы получить свои номера

$re = "/(\d+)/";
$str = "abcdefg123hijklm";

preg_match($re, $str, $matches);

и (123 может быть $ соответствует [1] сверху):

   preg_grep('/123/', $array);

http://www.php.net/manual/en/function.preg-grep.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...