preg_replace_callback:正则表达式搜索和替换

时间:2013-01-25 00:41:25

标签: php preg-replace replace preg-replace-callback

$details = "text...[book=123]...text...";

$details = preg_replace_callback(
  "/\[book=(.+?)\]/smi",
  function ($m) {
      global $skip_books;
      $book = $m[1];  // 123
      $feed = $m[2];  // 456       
  return "<div id=\"view_book_".$book."_".$feed."\"></div>";
  },
  $details
);

使用这种模式,我只能得到$ book($ m [1]):

"/\[book=(.+?)\]/smi"`

但我想得到$ feed($ m [2]),所以我替换为[book = 123_456]。

如何在下划线后获得“456”($ m [2])?

"/\[book=(.+?)_(.+?)\]/smi" ???

1 个答案:

答案 0 :(得分:2)

此处不要使用global;您已经在使用闭包,因此请使用use

function ($m) use ($skip_books) {
    // ...
}

顺便说一下,到目前为止,你实际上并没有在你显示的代码中使用$skip_books,但我认为这是因为你简化了它

如果您的参数始终是数字,请不要使用类似(.+?)的通用内容,但要具体(越多越好):

/\[book=(\d+)_(\d+)\]/i

我还删除了/s/m修饰符,这些修饰符在这里没用。