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
модификаторы, которые здесь бесполезны.