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

Тема в разделе "Как сделать...", создана пользователем bork75, 11 май 2015.

  1. bork75

    bork75 The Team

    Регистр.:
    21 июн 2008
    Сообщения:
    1.451
    Симпатии:
    677
    Помогите написать несложный код.

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

    Типа того, но пример не работает (проблема именно с кириллицей)
    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$word0$charset) !== false) {
      return 
    true;
      }
      continue;
      }
      return 
    false;
    }


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

    if(
    check_string($str,$words))
      echo 
    "Найдено совпадение";
    else
      echo 
    "Не найдено ";
    Добавлено:
    Разобрался, проблема в кодировке сохраняемого файла, теперь тогда другой вопрос.
    Как упростить этот код, чтобы минимум нагрузки на сервер?
     
    Последнее редактирование: 11 май 2015
  2. vitbsd

    vitbsd Постоялец

    Регистр.:
    26 ноя 2009
    Сообщения:
    111
    Симпатии:
    76
    Я бы так:
    Код:
    $str = 'Иванов Петров Сидоров';
    $words = array('слово', 'Петров');
    
    foreach($words as $value){
        echo (substr_count(mb_strtolower($str),mb_strtolower($value)))?"Найдено":"Не найдено";
    }
     
    bork75 нравится это.
  3. Marshan Busiko

    Marshan Busiko Постоялец

    Регистр.:
    29 сен 2007
    Сообщения:
    102
    Симпатии:
    77
    Если важно быстродействие и не нужно точно знать, сколько раз искомое слово встречается в строке, а только важен факт того - есть ли в строке искомое слово или нет, то вместо substr_count быстрее будет использовать strpos
     
    bork75 нравится это.
  4. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.463
    Симпатии:
    114
    а почему бы не использовать preg_match() ?
     
  5. Marshan Busiko

    Marshan Busiko Постоялец

    Регистр.:
    29 сен 2007
    Сообщения:
    102
    Симпатии:
    77
    preg_match на порядок (т.е. примерно в 10 раз) медленнее и именно поэтому в официальных доках рекомендуют (цитирую)

     
    bork75 нравится это.
  6. bork75

    bork75 The Team

    Регистр.:
    21 июн 2008
    Сообщения:
    1.451
    Симпатии:
    677
    Вот это уже ближе к тому, что мне нужно.
    Мне действительно не важно, сколько раз слово встречается, важен сам факт наличия слово.
    Напишите, пожалуйста, конечный код, чтобы в конце было просто:

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

    vitbsd Постоялец

    Регистр.:
    26 ноя 2009
    Сообщения:
    111
    Симпатии:
    76
    PHP:
    $str 'Иванов Петров Сидоров';
    $words = array('слово''Петров');

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

     
    bork75 нравится это.
  8. bork75

    bork75 The Team

    Регистр.:
    21 июн 2008
    Сообщения:
    1.451
    Симпатии:
    677
    Наверное, не правильно написал, все намного проще, мне нужно выводить результат не по каждому вхождению, а в целом.
    Т.е. либо найдено минимум одно вхождение, либо не найдено ни одного.

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

    vitbsd Постоялец

    Регистр.:
    26 ноя 2009
    Сообщения:
    111
    Симпатии:
    76
    Вот такой костыль вырос.

    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;
     
    Последнее редактирование: 12 май 2015
    bork75 нравится это.