1

同じテキスト内の複数の一致に対してこのフィルターを機能させるにはどうすればよいですか?

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 [ここをクリック|node:4] enim ad minim veniam, quis [ここをクリック|term:42] nostrud exercitation ullamco Laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum [ここをクリック|期間:1] dolore eu fugiat nulla pariatur. Exceptioneur sint occaecat cupidatat non proident, sunt in culpa [ここをクリック|ノード:42] qui officia deserunt mollit anim id est labourum.

目標は、各 [...] を適切なリンクに置き換えることです。

4

2 に答える 2

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;
}
于 2012-09-23T20:06:40.127 に答える
0

のドキュメントをpreg_replace参照してください。

最後のパラメーター ( 1) は、最初に出現したものだけを置換することを明示的に示しています。それを削除すると、すべてのオカレンスが置き換えられます。

于 2012-09-23T19:53:58.360 に答える