在preg_replace之前获取更多信息

时间:2014-07-04 09:13:44

标签: php

我有一个脚本可以将评论中的所有BBCODES替换为HTML。

我已设法转换除用户名代码[user="max"]之外的所有简单代码,因为我需要获取更多用户信息,例如用户信誉和用户信息。来自数据库的用户在线状态。

  $bbextended = array(
    "/\[url](.*?)\[\/url]/i" => "<a href=\"http://$1\" title=\"$1\">$1</a>",
    "/\[user=(.*?)\]/i" => "<div class=\"user\"> <a href=\"/user/$1\" title=\"$1\">$1</a><span> $USER REPUTATION </span></div>",
  );

  foreach($bbextended as $match=>$replacement){
    $bbtext = preg_replace($match, $replacement, $bbtext);
  }

由于preg_replace替换了其函数内的匹配项,我无法获取用户名以从数据库中获取其他用户信息。

1 个答案:

答案 0 :(得分:1)

如果您使用preg_replace_callback,您会发现可以大规模扩展您的BBCode库。

示例:

$bbextended = array(
  "/\[url](.*?)\[\/url]/i" => "<a href=\"http://$1\" title=\"$1\">$1</a>",
  "/\[user=(.*?)\][\/url]/i" => function($m) {
    $foo = "bar";
    return "<div class=\"user\" <a href=\"/user/".$m[1]."\" title=\"".$m[1]."\">"
                        .$m[1]."</a><span> ".$foo." </span></div>";
  }
);

foreach($bbextended as $match=>$replacement){
  if( is_callable($replacement)) {
    $bbtext = preg_replace_callback($match, $replacement, $bbtext);
  }
  else {
    $bbtext = preg_replace($match, $replacement, $bbtext);
  }
}