Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.04.2013, 17:17
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Переменная рег. выражения как аргумент ф-ции.
Всем доброго времени суток. Прошу помощи с кодом.
Вообщем, есть такой код:
$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".
Буду благодарен за помощь.
Ответить с цитированием
  #2 (permalink)  
Старый 22.04.2013, 22:25
Интересующийся
Отправить личное сообщение для vostok Посмотреть профиль Найти все сообщения от vostok
 
Регистрация: 19.11.2012
Сообщений: 18

Надо обернуть в кавычки:
$month[floatval('$2')]
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2013, 06:20
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

vostok, не работает, в ф-цию так и отправляет строку '$2', в двойные кавычки тоже пробовал - не работает.
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2013, 09:48
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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');


Сделал так, но мне все равно кажется, что можно сделать как-то проще.
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2013, 10:39
Интересующийся
Отправить личное сообщение для vostok Посмотреть профиль Найти все сообщения от vostok
 
Регистрация: 19.11.2012
Сообщений: 18

Так будет работать.
$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;
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2013, 18:04
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

vostok, не работает, ошибка:
Цитата:
Parse error: syntax error, unexpected T_FUNCTION
Вот так ошибку не выдаёт, но месяц из массива все равно не показывает:
$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;
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2013, 19:07
Интересующийся
Отправить личное сообщение для vostok Посмотреть профиль Найти все сообщения от vostok
 
Регистрация: 19.11.2012
Сообщений: 18

Сообщение от Ruslan_xDD
vostok, не работает, ошибка:
Цитата:
Parse error: syntax error, unexpected T_FUNCTION
Возможно у вас старая версия php. У меня версия 5.4.5 и всё работает.
Ну так ещё можно попробовать:
$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() например.
Ответить с цитированием
  #8 (permalink)  
Старый 23.04.2013, 19:23
Интересующийся
Отправить личное сообщение для vostok Посмотреть профиль Найти все сообщения от vostok
 
Регистрация: 19.11.2012
Сообщений: 18

И если использовать 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;
Ответить с цитированием
  #9 (permalink)  
Старый 24.04.2013, 04:46
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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');


Может тут ещё что-нибудь можно сжать или что-нибудь сделать, чтобы работало быстрее?

Последний раз редактировалось ruslan_mart, 24.04.2013 в 05:04.
Ответить с цитированием
  #10 (permalink)  
Старый 24.04.2013, 09:42
Интересующийся
Отправить личное сообщение для vostok Посмотреть профиль Найти все сообщения от vostok
 
Регистрация: 19.11.2012
Сообщений: 18

Сообщение от Ruslan_xDD
Может тут ещё что-нибудь можно сжать или что-нибудь сделать, чтобы работало быстрее?
Тут нечего сжимать. Уж если надо ещё быстрее откажитесь от регулярных выражений и create_function и воспользуйтесь substr().
create_function есть смысл использовать при создании функций на основании информации, полученной во время выполнения программы.
Форматируйте код понятнее, понятный код работает быстрее - зачем \' когда можно ".
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переменная как значение функции. Jurasmi Общие вопросы Javascript 7 22.04.2010 12:45
Переменная JS как индекс в PHP mirage009 Серверные языки и технологии 4 28.02.2010 21:01
как проверить, есть ли переменная Аскар Общие вопросы Javascript 3 04.01.2010 17:09
Строковая переменная как имя объекта MaxLazar Общие вопросы Javascript 4 06.10.2009 00:21
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25