正则表达式中的正则表达式可选单词

时间:2015-09-16 15:39:48

标签: php regex

我正在尝试使用正则表达式搜索某些数组。有些单词应该是" optional",这意味着如果它们在字符串中(对于相关性)它会很好

这是我的尝试:

preg_match_all('/(?:animal)? (lamina)/', $searchExpression, $matches);

虽然不起作用。我想在这里实现的是,这个字符串必须包含lamina,并且可能包含动物。 如果该字符串同时包含动物和叶片,则它将具有更好的相关性,然后匹配与叶片匹配的匹配。

如何修复正则表达式?我如何对比赛进行排序,看看哪一个匹配"最好的。

$animalStuff = array('animal lamina', 'lamina', 'animal');

前两项应该匹配,第三项不应该匹配。和动物叶片应该是最相关的。如何执行相关性?

$animalStuff = array('animal lamina', 'lamina', 'animal');

$results = array();

foreach ($animalStuff as $searchExpression)
{
    preg_match_all('/(?:animal)? (lamina)/', $searchExpression, $matches);

    var_dump($matches);

    // Do something here to decide if it should be in the top of array, etc.
}

计算匹配数量,可能会让我得到最好的相关性,但我只需要让正则表达式首先尝试一下。

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

preg_match_all('/(animal.*?lamina)|(lamina)/', $searchExpression, $matches);

请参阅DEMO

答案 1 :(得分:0)

(这应该是评论)

这里有几个问题,如果你停止使用正则表达式来查找匹配项,大多数问题就会消失。那么为什么要使用正则表达式呢?

e.g。考虑:

function matchwords($allwords, $requiredwords, $subject)
{
   $subject=preg_replace("/\W/", ' ', $subject);
   $subject=explode(' ', $subject);
   if (count(array_intersect($requiredwords, $subject)) {
      return count(array_intersect($allwords, $subject));
   }
   return 0;
}

尝试对其进行基准测试 - 它实际上可能比使用正则表达式更快。对于大字集,反转数组并使用array_intersect_key()可能会更快。