Переменная рег. выражения как аргумент ф-ции.
Всем доброго времени суток. Прошу помощи с кодом.
Вообщем, есть такой код: $a = '2013-04-22 11:22:00'; $month = array('Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря'); $a = preg_replace('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2}))/', '$3 '.$month[floatval($2)].' $1г. в $4', $a); Нужно как-то получить значение из массива $month, но вот воспринимать переменную $2 не хочет, пишет ошибку. Как быть? В итоге должна получится строка: "22 Апреля 2013г. в 11:22". Буду благодарен за помощь. |
Надо обернуть в кавычки:
$month[floatval('$2')] |
vostok, не работает, в ф-цию так и отправляет строку '$2', в двойные кавычки тоже пробовал - не работает.
|
function dates($a) { $month = array('Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря'); $reg = '/^(\d{4})-(\d{2})-(\d{2})\s(\d{2}):(\d{2}):(\d{2})/'; $b = preg_replace($reg, '$2', $a); return preg_replace($reg, '$3 '.$month[floatval($b)-1].' $1г. в $4:$5', $a); } echo dates('2013-04-23 16:47:00'); Сделал так, но мне все равно кажется, что можно сделать как-то проще. |
Так будет работать.
$a = '2013-04-22 11:22:00'; $a = preg_replace_callback('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2}))/', function($matches) { $month = array('Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря'); return $matches[3].' '.$month[floatval($matches[2])].' '.$matches[1].' г. в '.$matches[4]; }, $a); echo $a; |
vostok, не работает, ошибка:
Цитата:
$a = '2013-04-22 11:22:00'; $month = array('Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря'); $a = preg_replace_callback('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2}))/', create_function( '$matches', 'return $matches[3].\' \'.$month[floatval($matches[2])].\' \'.$matches[1].\' г. в \'.$matches[4];' ), $a); echo $a; |
Цитата:
Ну так ещё можно попробовать: $a = '2013-11-22 11:22:00'; function callback($matches) { $month = array( 'Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря' ); return $matches[3].' '.$month[floatval($matches[2]) - 1].' '.$matches[1].' г. в '.$matches[4]; } $a = preg_replace_callback('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2}))/', 'callback', $a); echo $a;Если не работает, то наверно надо php обновить или отказаться от этой логики и использовать строковые функции substr() например. |
И если использовать create_function то массив $month надо запихнуть в нее же тогда он будет виден:
$a = '2013-04-22 11:22:00'; $a = preg_replace_callback('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2}))/', create_function( '$matches', '$month = array( "Января", "Февраля", "Марта", "Апреля", "Мая", "Июня", "Июля", "Августа", "Сентября", "Октября", "Ноября", "Декабря" ); return $matches[3]." ".$month[floatval($matches[2])]." ".$matches[1]." г. в ".$matches[4];' ), $a); echo $a; |
vostok, хм... вариант с create_function помог, спасибо.
Вот готовый вариант: function dates($a) { return preg_replace_callback('/^(\d{4})-(\d{2})-(\d{2})\s((\d{2}):(\d{2})):(\d{2})$/', create_function( '$b', '$c = array(\'Января\', \'Февраля\', \'Марта\', \'Апреля\', \'Мая\', \'Июня\', \'Июля\', \'Августа\', \'Сентября\', \'Октября\', \'Ноября\', \'Декабря\'); return ($b[1].$b[2].$b[3]==date(\'Ymd\')?\'Сегодня\':$b[3].\' \'.$c[floatval($b[2]-1)].\' \'.$b[1].\' г.\').\' в \'.$b[4];' ), $a); } echo dates('2013-04-23 11:22:00'); Может тут ещё что-нибудь можно сжать или что-нибудь сделать, чтобы работало быстрее? |
Цитата:
create_function есть смысл использовать при создании функций на основании информации, полученной во время выполнения программы. Форматируйте код понятнее, понятный код работает быстрее - зачем \' когда можно ". |
Часовой пояс GMT +3, время: 13:19. |