Как preg_match_all() + извлечь + заменить + удалить?

У меня нет большого опыта работы с preg_match_all и подобными, и я ищу простой способ сделать следующее:

Рассмотрим этот текст:

$string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';

Что мне нужно сделать:

  1. Получить данные (здесь метки времени) между ВСЕМИ тегами [set_stamp] и [/set_stamp]
  2. Замените все захваченные метки времени соответствующей датой, например: date('Y-m-d H:i:s', $timestamp)
  3. Удалить все теги [set_stamp] и [/set_stamp]

Окончательный вывод будет примерно таким:

«Этот текст был написан 12.07.2012 в 14:26, а этот — 11.07.2012 в 17:10».


person user1033406    schedule 02.07.2012    source источник


Ответы (1)


Вы можете использовать preg_replace_callback() со следующим регулярным выражением:

#\[set_stamp\](.+)\[/set_stamp\]#iU

Пример кода:

$string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';
echo preg_replace_callback('#\[set_stamp\](.+)\[/set_stamp\]#iU', function($m) {
    return date('Y-m-d H:i', $m[1]);
}, $string);

Вывод этого кода:

Этот текст был написан 30.06.2012 в 16:20, а этот — 28.06.2012 в 19:05.

Обратите внимание, что для анонимной функции требуется как минимум PHP 5.3. Если вы используете старую версию и действительно не можете ее обновить, просто создайте обычную функцию и передайте ее имя в виде строки.

person ThiefMaster    schedule 02.07.2012
comment
Большое спасибо за Вашу помощь! Именно то, что мне было нужно. - person user1033406; 03.07.2012