如何找到至少匹配2个关键字的字符串php

时间:2018-10-18 16:04:14

标签: php arrays regex search strpos

这可能是一个愚蠢的问题,但是有没有一种体面而又有效的方式可以在不编写大量代码的情况下提供对字符串的搜索?

麻烦的是,在以后的代码处理之前,我需要在字符串内匹配至少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 :(得分:1)

$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
        )

)

Sandbox

  • \b是单词边界(诸如空格,标点符号之类的东西)
  • ( ... )是一个捕获组
  • |是或

因此正则表达式看起来像/\b(lorem|ipsum|dog|cat)\b/i。然后preg_quote会在正则表达式中的关键字中转义重要的内容(以防万一)。像.这样的任何字符都需要转义。

如果您要确保您有x个匹配项,那么您只需计数。

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

在这种情况下,您可以使用0索引,但是使用1更为合适,因为它用于第一个捕获组,其中0表示任何匹配项。

享受!