【问题标题】:Regex optional word in regex正则表达式中的正则表达式可选词
【发布时间】:2015-12-13 07:18:21
【问题描述】:

我正在尝试使用正则表达式搜索一些数组。有些词应该是“可选的”,这意味着如果它们在字符串中就很好(为了相关性)

这是我的尝试:

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

但它不起作用。我在这里想要实现的是,字符串必须包含 lamina,并且可能包含动物。 如果字符串同时包含 animal 和 lamina,那么它的相关性会比只匹配 lamina 的匹配更好。

如何修复正则表达式?以及如何对匹配项进行排序,还要查看哪个“匹配”最好。

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

前 2 个项目应该匹配,第三个不应该。和动物层可能应该是最相关的。如何执行相关性?

$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.
}

计算匹配的数量,可能会让我得到我认为的最佳相关性,但我只需要先让正则表达式工作即可尝试。

【问题讨论】:

  • 单词后面的空格也必须是可选的,否则只匹配第二个单词。
  • 如果 lamina 在字符串中? /(叶片)/gi
  • 删除正则表达式中的空格,给我结果,但它们都不包含“动物”,因为第一个应该: ray(2) { [0]=> array(1) { [0 ]=> string(6) "lamina" } [1]=> array(1) { [0]=> string(6) "lamina" } } array(2) { [0]=> array(1) { [0]=> string(6) "lamina" } [1]=> array(1) { [0]=> string(6) "lamina" } }
  • 如果您想包含单词animal,请取消非捕获组。 ?: 使其不捕获,尾随 ? 使整个组可选。
  • 这是什么意思 chris85?可以举个例子吗?

标签: php regex


【解决方案1】:

您可以使用以下内容:

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

DEMO

【讨论】:

  • 为什么是空格?空格无关紧要,它是我专门寻找的“词”
  • @JohnSvensson 你的意思是说,我们也可以有像"animal hello lamina" 这样的字符串?
  • 是的,我正在寻找字符串中的单词,而不是完全匹配的字符串
  • @JohnSvensson 那么你可以使用管道操作符..检查更新:)
  • 那么问题是lamina仍然是“必需的”,“动物”可以在那里,你明白吗? :)
【解决方案2】:

(这应该是评论)

这里有几个问题,如果您停止使用正则表达式来查找匹配项,大部分问题都会消失。因此为什么需要使用正则表达式?

例如考虑:

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() 可能会更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多