首页 文章

文本过滤器,多个匹配

提问于
浏览
0

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

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] nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat . Duis aute irure dolor in repreptderit in velptate velit esse cillum [点击这里|术语:1] dolore eu fugiat nulla pariatur . Excepteur sint occaecat cupidatat non proident,sunt in culpa [点击这里|节点:42] qui officia deserunt mollit anim id est laborum .

目标是通过适当的链接替换每个[...] .

2 回答

  • 0

    documentation of preg_replace .

    最后一个参数( 1 )明确表示您只想替换第一个匹配项 . 删除它,所有事件都应该更换 .

  • 0

    修改函数_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;
    }
    

相关问题