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 ответ

Решение

Не использовать global Вот; вы уже используете закрытие, так что используйте use:

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

Кстати, вы на самом деле не используете $skip_books в коде, который вы показали до сих пор, но я предполагаю, что это потому, что вы упростили его

Если ваши аргументы всегда числа, не используйте что-то общее (.+?) но будьте конкретны (чем больше, тем лучше)

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

Я также удалил /s а также /m модификаторы, которые здесь бесполезны.

Другие вопросы по тегам