当前位置: 首页 > 知识库问答 >
问题:

文本过滤器,多个匹配项

和嘉澍
2023-03-14

如何使此过滤器在同一文本中的多个匹配项上工作?

function _embed_link($text, $filter, $format) {
  if (preg_match_all("/\[(.*?)\|(node|term)\:(\d+)\]/i", $text, $params)) {
    foreach ($params[0] as $key => $param) {
      $args = array(
        $params[0][$key],
        $params[1][$key],
        $params[2][$key],
        $params[3][$key],
      );
      $markup = _embed_link_process($args);
      $text = preg_replace("/\[(.*?)\|(node|term)\:(\d+)\]/", $markup, $text, 1);
    }
  }

  return $text;
}

这是返回链接的函数

function _embed_link_process($params = array()) {
  $output = '';

  if ($params[2] == 'node') {
    // Find node by it's id
    $node = node_load($params[3]);
    $output .= render(l($params[1], 'node/'. $node->nid, array(
      'attributes' => array(
        'class' => array('embed-link', 'embed-link-node', 'embed-link-node-'. $node->nid),
      ),
    )));
  }

  if ($params[2] == 'term') {
    $term = taxonomy_term_load($params[3]);;
    $output .= render(l($params[1], 'taxonomy/term/'. $term->tid, array(
      'attributes' => array(
        'class' => array('embed-link', 'embed-link-term', 'embed-link-term-'. $term->tid),
      ),
    )));
  }

  return $output;
}

使用筛选器的示例文本:

Ut[点击这里|节点: 4]enim ad minim veniam,quis[点击这里|术语: 42]nostr的练习ullamco的劳动是新的和其他的结果。Duis ate irure Dolor in re的谴责在流言蜚语velit esse cilum[点击这里|术语: 1]Dolore eu fugiat nulla pariatur. Excepteur sint的情况下不存在,在过失中不存在[点击这里|节点: 42]qui的办公室是不存在的。

目标是将每个 [...] 替换为正确的链接。

共有2个答案

华昕
2023-03-14

请参阅preg_replace的文档。

最后一个参数1)明确表示您只想替换第一次出现的。删除它,所有出现的都应该被替换。

长孙骏
2023-03-14

修改function _embed_link以使用preg_match_all

function _embed_link($text, $filter, $format) {
  if (preg_match_all("/\[(.*?)\|(node|term)\:(\d+)\]/i", $text, $params)) {
    foreach ($params[0] as $key => $param) {
      // $param => [Click here|node:4]
      $param_arr  = array (
        $params[0][$key], // [Click here|node:4]
        $params[1][$key], // Click here
        $params[2][$key], // node
        $params[3][$key], // 4
      );
      $markup = _embed_link_process($param_arr);
      $text = str_replace($param, $markup, $text);
    }
  }

  return $text;
}
 类似资料:
  • 我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:

  • 问题内容: 我在ES中有一个多匹配查询,并希望添加一个过滤器。 添加此过滤器的语法是什么? 我试过了: 问题答案: 根据您的需要,必须将过滤器放置在正确的位置。您有两种选择: 使用顶级过滤器,并将该过滤器仅应用于搜索结果,而不应用于各个方面 使用过滤的查询,并将过滤器应用于搜索结果和构面

  • 问题内容: 我需要按类别过滤项目列表。我希望用户能够单击一个按钮,然后将过滤器应用于列表。 目前,我已经在一定程度上进行了这项工作。 举例来说,我有一个电影列表,如下所示: 我还有一个电影流派列表(渲染为按钮,单击该按钮将过滤电影列表),如下所示: (“ changeGenre()”函数所做的全部工作就是更新范围,以显示当前正在查看的流派)。 现在这个方法可以正常工作,直到我遇到两种类型的情况:“

  • 我不熟悉Elasticsearch和Nest,请原谅我的无知。我想在Elasticsearch v2.3.5中使用过滤器和multi\u匹配查询,但到目前为止,我还无法解决这个问题。我想,一旦我把它用于Elasticsearch,我应该能够将它映射到Nest。 以下是我的JSON数据结构: 下面是我的工作搜索查询(没有任何过滤器): 我只想在搜索结果中向用户显示这些记录,其中: 我尝试了不同的查询

  • 该方案是: 在Java7中,下面的软件运行良好。为什么这个管用而上面不管用?

  • 问题内容: 我正在使用ORB特征检测器使用以下代码查找两个图像之间的匹配项: 我的问题是我找不到过滤匹配项的方法,因此仅当它们在照片中具有相似位置时才匹配。即使一个关键点在位置上距离很远,我也总是会得到多个匹配。 有没有办法更好地过滤它们? 问题答案: 为了获得更好的匹配结果,您应该以给定的顺序包括这些过滤方法。 在两个方向上执行匹配,即对于第一张图像中的每个点,在第二张图像中找到最佳匹配,反之亦