На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Поиск несколько подстрок в строке? , Когда разные варианты написания подстроки
      Добрый день!

      Есть вот такой пример кода, который ищет в строке, все слова взятые из массива.
      Если все слова найдены, выдается результат True, если хотя бы одно слово не найдено, - False.

      ExpandedWrap disabled
        <?php
         
        $keywords = array('apple', 'iphone-13', '128-gb', 'violett');
        $string = '-apple-iphone-13-128-gb-violett-dual-sim-2764482';
         
        echo 'String: '.$string."<br>";
         
        // Подсчитаем, сколько всего ключевых слов в массиве
        $keywords_total = count($keywords);
         
        // Объявим переменную "keywords_find"
        $keywords_find = 0;
         
        // Перебираем массив, и ищем в строке каждое ключевое слово из массива
        foreach ($keywords as &$keyword) {
         
          // Если ключевое слово найдено в строке
          if (strpos($string, $keyword)) {
         
            // Увеличиваем на единицу переменную "keywords_find"
            $keywords_find++;
            
            echo 'Keyword: '.$keyword." (True)<br>";
          }
         
          // Если ключевое слово не найдено в строке
          else {
            echo 'Keyword: '.$keyword." (False)<br>";
          }
        }
         
        echo 'Total Keywords: '.$keywords_total."<br>";
        echo 'Find Keywords: '.$keywords_find."<br>";
         
        // Если количество найденных в строке ключевых слов, равно количеству
        // кличевых слов в массиве
        if ($keywords_find == $keywords_total) {
          echo 'Result: True<br>';
        }
         
        // Если не равно
        else {
          echo 'Result: False<br>';
        }
         
         
        ?>



      Результат:

      Цитата

      String: -apple-iphone-13-128-gb-violett-dual-sim-2764482

      Keyword: apple (True)
      Keyword: iphone-13 (True)
      Keyword: 128-gb (True)
      Keyword: violett (True)

      Total Keywords: 4
      Find Keywords: 4

      Result: True


      Дело в том, что в заданной строке, название одного и того же цвета, может быть написано по разному, например: "violett" или "purple". (-apple-iphone-13-128-gb-purple-dual-sim-2764482) или (-apple-iphone-13-128-gb-violett-dual-sim-2764482)
      Объем памями тоже может быть указан в строке, как: "128-gb" или "128gb".

      Собственно сам вопрос, какие будут идеи, чтобы при проверки строки, можно было учесть все эти нюансы, чтобы добиться результата True?
      Сообщение отредактировано: iPhonesoft -
        ExpandedWrap disabled
          $string = str_replace(array("violett","128gb"), array("purple","128-gb"), "-apple-iphone-13-128-gb-violett-dual-sim-2764482");
          Спасибо за Вашу идею! Наверное это самый простой вариант, привести все данные к единому виду.
            Можно вместо массива вариантов строк - использовать регулярные выражения (собственно в которых и "зашиваются" варианты).
            Плюс этого подхода в том, что одной проверкой можно оценить сразу весь список вариантов, без организации внутренних циклов.
              Спасибо за идею! Буду тоже пробовать, посмотрю потом, какой из вариантов будет удобней в работе.
                Цитата Majestio @
                Можно вместо массива вариантов строк - использовать регулярные выражения (собственно в которых и "зашиваются" варианты).
                Плюс этого подхода в том, что одной проверкой можно оценить сразу весь список вариантов, без организации внутренних циклов.

                Регулярное выражение не так удобно редактировать при наличии большого списка замен. А массивы можно легко загрузить хоть из файла, хоть из базы данных. А внутренних циклов надо посмотреть где ещё будет больше. Разбор регулярного выражения явно сложнее простого индексирования.
                  Цитата macomics @
                  А внутренних циклов надо посмотреть где ещё будет больше. Разбор регулярного выражения явно сложнее простого индексирования.

                  Вместо массива массивов строк замены - я предлагаю массив регулярок. Не думаю, что с массивом регулярок возникнут какие-то значимые сложности.
                    Но на обработку регулярного выражения явно тратится больше времени, чем на сопоставление двух массивов по индексам.
                      Цитата macomics @
                      Но на обработку регулярного выражения явно тратится больше времени, чем на сопоставление двух массивов по индексам.

                      Не всегда. Пример:

                      -apple-iphone-13-128-gb-violett-dual-sim-<любое семизначное число>

                      Тебе нужно предусмотреть 9+ млн "вариантов" и их перебрать в цикле. Регулярка это делает за раз.
                        Цитата Majestio @
                        Не всегда. Пример:

                        -apple-iphone-13-128-gb-violett-dual-sim-<любое семизначное число>

                        Тебе нужно предусмотреть 9+ млн "вариантов" и их перебрать в цикле. Регулярка это делает за раз.

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

                        -apple-iphone-13-128-gb-#8A2BE2-dual-sim-2764482
                        -apple-iphone-13-128-gb-#9370DB-dual-sim-2764482
                        -apple-iphone-13-128-gb-#BA55D3-dual-sim-2764482
                        -apple-iphone-13-128-gb-#FF00FF-dual-sim-2764482
                        -apple-iphone-13-128-gb-#EE82EE-dual-sim-2764482
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0264 ]   [ 15 queries used ]   [ Generated: 27.04.24, 06:53 GMT ]