Поиск хотя бы одного вхождения в строке

bork75

The Team
Регистрация
21 Июн 2008
Сообщения
1.455
Реакции
734
Помогите написать несложный код.

На входе строка с текстом. Указываем слова которые ищем в строке.
Если найдено одно из слов (или часть слова), то выполнить условие.

Типа того, но пример не работает (проблема именно с кириллицей)
PHP:
function check_string($str, $words, $charset = 'UTF-8')
{
  $str = mb_strtolower($str, $charset);
  foreach($words as $word) {
  $word = mb_strtolower($word, $charset);
  if (mb_strpos($str, $word, 0, $charset) !== false) {
  return true;
  }
  continue;
  }
  return false;
}


$str = 'Иванов Перов Сидоров';
$words = array('слово', 'петр');

if(check_string($str,$words))
  echo "Найдено совпадение";
else
  echo "Не найдено ";

Добавлено:
Разобрался, проблема в кодировке сохраняемого файла, теперь тогда другой вопрос.
Как упростить этот код, чтобы минимум нагрузки на сервер?
 
Последнее редактирование:
Я бы так:
Код:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');

foreach($words as $value){
    echo (substr_count(mb_strtolower($str),mb_strtolower($value)))?"Найдено":"Не найдено";
}
 
Если важно быстродействие и не нужно точно знать, сколько раз искомое слово встречается в строке, а только важен факт того - есть ли в строке искомое слово или нет, то вместо substr_count быстрее будет использовать strpos
 
а почему бы не использовать preg_match() ?
 
а почему бы не использовать preg_match() ?

preg_match на порядок (т.е. примерно в 10 раз) медленнее и именно поэтому в официальных доках рекомендуют (цитирую)

Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.

Не используйте preg_match() если вам нужно лишь проверить, содержит ли одна строка другую подстроку. Используйте вместо этого strpos() или strstr(), так как эти функции работают быстрее.
 
Я бы так:
Код:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');

foreach($words as $value){
    echo (substr_count(mb_strtolower($str),mb_strtolower($value)))?"Найдено":"Не найдено";
}

Если важно быстродействие и не нужно точно знать, сколько раз искомое слово встречается в строке, а только важен факт того - есть ли в строке искомое слово или нет, то вместо substr_count быстрее будет использовать strpos

Вот это уже ближе к тому, что мне нужно.
Мне действительно не важно, сколько раз слово встречается, важен сам факт наличия слово.
Напишите, пожалуйста, конечный код, чтобы в конце было просто:

PHP:
if ...
  echo "Найдено совпадение";
else
  echo "Не найдено ";
 
Вот это уже ближе к тому, что мне нужно.
Мне действительно не важно, сколько раз слово встречается, важен сам факт наличия слово.
Напишите, пожалуйста, конечный код, чтобы в конце было просто:

PHP:
if ...
  echo "Найдено совпадение";
else
  echo "Не найдено ";

PHP:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');

foreach($words as $value){
    if(strpos(mb_strtolower($str),mb_strtolower($value))){
        echo "Найдено";
    }else{
        echo "Не найдено";
    }
}
 
PHP:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');

foreach($words as $value){
    if(strpos(mb_strtolower($str),mb_strtolower($value))){
        echo "Найдено";
    }else{
        echo "Не найдено";
    }
}

Наверное, не правильно написал, все намного проще, мне нужно выводить результат не по каждому вхождению, а в целом.
Т.е. либо найдено минимум одно вхождение, либо не найдено ни одного.

PHP:
if ...
 echo "Найдено одно или более вхождение из массива";
else
 echo "Не найдено ни одного слова из массива";
 
Наверное, не правильно написал, все намного проще, мне нужно выводить результат не по каждому вхождению, а в целом.
Т.е. либо найдено минимум одно вхождение, либо не найдено ни одного.

PHP:
if ...
echo "Найдено одно или более вхождение из массива";
else
echo "Не найдено ни одного слова из массива";

Вот такой костыль вырос.

PHP:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');
$aa = 'Не найдено';

foreach($words as $value){
    if(strpos(mb_strtolower($str),mb_strtolower($value))){
        $aa = "Найдено";break;
    }
}
echo $aa;

или вот так

PHP:
$str = 'Иванов Петров Сидоров';
$words = array('слово', 'Петров');

foreach($words as $value){
    if(!strpos(mb_strtolower($str),mb_strtolower($value))){
        $aa = "Не найдено";continue;
    }else{
        $aa = "Найдено";break;
    }
}
echo $aa;
 
Последнее редактирование:
Назад
Сверху