Как найти строку, которая соответствует как минимум 2 ключевых слов php - PullRequest
0 голосов
/ 18 октября 2018

Это может быть глупый вопрос, но есть ли приличный и эффективный способ обеспечить поиск по строке без записи тонны кода?

Беда в том, что мне нужно сопоставить хотя бы 2 ключевых слова внутри строки перед будущей обработкой кода.

Я попробовал regex, preg_match, strpos и теперь пробовал с массивами, но ничего не получилось.

Вот немного кода, над которым я работаюпрямо сейчас:

$keywords = array('lorem','ipsum','dog','cat' );
            $text="lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur";

            if (count(array_intersect(explode(' ', $text),$keywords))) {
              echo '<p>'.$message_id_that_contains_at_least_2_keywords.'</p><br>';
              }

Это не должен быть метод массива, это может быть что угодно, что не убивает мой сервер:)

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 18 октября 2018

Вот так

$keywords = array('lorem','ipsum','dog','cat' );
$text="lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur";

preg_match_all('/\b('.implode('|', array_map('preg_quote',$keywords)).')\b/i',  $text, $matches);

print_r($matches);

Вывод:

   Array
(
    [0] => Array
        (
            [0] => lorem
            [1] => ipsum
        )

    [1] => Array
        (
            [0] => lorem
            [1] => ipsum
        )

)

Песочница

  • \b - это граница слова (вещикак пробелы, пунктуация)
  • ( ... ) - это группа захвата
  • | is или

Так что регулярное выражение выглядит как /\b(lorem|ipsum|dog|cat)\b/i.И тогда preg_quote избегает вещей, которые важны в Regex в ключевых словах (на всякий случай).Такие вещи, как ., то есть любой символ, необходимо экранировать.

Если вы хотите убедиться, что у вас есть x количество совпадений, то вы просто считаете.

 if(isset($matches[1]) && count($matches[1]) > 2) then do something....

Вв этом случае вы можете использовать индекс 0, но более правильно использовать 1, потому что это для первой группы захвата, где 0 для любых совпадений.

Наслаждайтесь!

...