X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
> Помогите составить рег. выражение
happyhand
happyhand
Topic Starter сообщение 13.6.2010, 15:57; Ответить: happyhand
Сообщение #1


Нужно выбрать из такой даты: 10 Мая 2010 число, день, год.
Т.е. выбрать число до слова (там может быть и 1 и 10), слово (может быть и Сентябрь, т.е. длинее) и число после слова.
А ещё лучше преобразовать её в timestamp, чтобы сравнить с текущей датой.
Не подскажете, как правильно составить рег. выражение?
Или есть другой способ?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 13.6.2010, 16:44; Ответить: Mulder_hb
Сообщение #2


Формируем timestamp:
[php]
$stamp = strtotime("10 Мая 2010");
[/php]
Такой способ может не работать.
Тогда парсим дату и формируем timestamp.
[php]
<?php
$str = "10 Мая 2010";
// Парсим дату
$reg = '{^\s* ( (\d+) \s* [[:punct:]] \s* (\S+) \s* [[:punct:]] \s* (\d+) ) \s*$}xs';
preg_match($reg, $str, $pockets)
or die("Это не дата.");
// pockets[2] - день
// pockets[3] - месяц
// pockets[4] - год

// Формируем timestamp
$stamp = mktime(0, 0, 0, $pockets[3], $pockets[2], $pockets[4]);

?>
[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
happyhand
happyhand
Topic Starter сообщение 13.6.2010, 17:27; Ответить: happyhand
Сообщение #3


Говорит "Это не дата"
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 13.6.2010, 20:15; Ответить: Mulder_hb
Сообщение #4


А если так:
{^\s* ( (\d+) \s* [[:punct:]] \s* (\S+) \s* [[:punct:]] \s* (\d+) ) \s*$}xs


Это универсальный скрипт парсинга. Может стоит чуть ослабить проверку.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexflasher
alexflasher
сообщение 13.6.2010, 22:37; Ответить: alexflasher
Сообщение #5


Mulder, во-первых
(\s+)

по вашему, будет сохранять месяц?

Во-вторых, к чему здесь "[[:punct:]]"? Автор ничего не упоминал о знаках пунктуации, к тому же, ваш реджекс не пропустит даты, которые без пунктуации.

Я бы, при условии, что строки будут содержать только "00 Месяц 0000", сделал бы так:
[PHP]<?php
$str = "10 Мая 2010";
$reg = '/^(\d+)\s*(\w+)\s*(\d+)$/';
preg_match($reg, $str, $pockets)
or die("Это не дата.");
print 'День: ' . $pockets[1] . '<br>';
print 'Месяц: ' . $pockets[2] . '<br>';
print 'Год: ' . $pockets[3] . '<br>';
?> [/PHP]
только могут быть проблемы с кирилицей - надо правильно настроить локаль.

С php мало знаком, как все это преобразовать потом в реальную дату не знаю..
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ottaviano
ottaviano
сообщение 13.6.2010, 23:05; Ответить: ottaviano
Сообщение #6


sergey-g, если я правильно тебя понял и тебе нужно вытянуть из даты три "величины" (день, месяц и год), то можно просто воспользоватся функцией
[PHP]explode(" ", $var);[/PHP]
например:
[PHP]
$var1 = "10 Мая 2010";
$var2 = explode(" ", $var1);
echo $var2[0]; // покажет 10
echo $var2[1]; // покажет май
echo $var2[2]; // покажет 2010
[/PHP]
но все эти данные типа String, следующие строки переводят String-числа в int-числа, теперь с ними можно проводить математические вычисления (если необходимо, конечно же)
[PHP]
$var2[0] = (int)$var2[0];
$var2[2] = (int)$var2[2];[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
happyhand
happyhand
Topic Starter сообщение 14.6.2010, 22:29; Ответить: happyhand
Сообщение #7


А потом преобразовать её в формат "2010-05-10" чтобы обработать функцией strtotime.

Сделал так:

[php]$test= "10 Мая 2010";
$date=explode(" ",$test);

echo $date['2']."-"; if($date['1']=="Января")echo "01";if($date['1']=="Февраля")echo "02";if($date['1']=="Марта")echo "03";if($date['1']=="Апреля")echo "04";if($date['1']=="Мая")echo "05";if($date['1']=="Июня")echo "06";if($date['1']=="Июля")echo "07";if($date['1']=="Августа")echo "08";if($date['1']=="Сентября")echo "09";if($date['1']=="Октября")echo "10";if($date['1']=="Ноября")echo "11";if($date['1']=="Декабря")echo "12"; echo"-"; echo $date['0'];[/php]

но теперь не знаю, что с этим делать:rolleyes:
Можно ли как-то запихнуть это в переменную?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ottaviano
ottaviano
сообщение 14.6.2010, 22:32; Ответить: ottaviano
Сообщение #8


(sergey-g @ 15.6.2010, 01:29) *
но теперь не знаю, что с этим делать

а что нужно? или нам подумать?

(sergey-g @ 15.6.2010, 01:29) *
Можно ли как-то запихнуть это в переменную?

а что именно?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
happyhand
happyhand
Topic Starter сообщение 14.6.2010, 22:44; Ответить: happyhand
Сообщение #9


Ну вот эта строчка

[php]echo $date['2']."-"; if($date['1']=="Января")echo "01";if($date['1']=="Февраля")echo "02";if($date['1']=="Марта")echo "03";if($date['1']=="Апреля")echo "04";if($date['1']=="Мая")echo "05";if($date['1']=="Июня")echo "06";if($date['1']=="Июля")echo "07";if($date['1']=="Августа")echo "08";if($date['1']=="Сентября")echo "09";if($date['1']=="Октября")echo "10";if($date['1']=="Ноября")echo "11";if($date['1']=="Декабря")echo "12"; echo"-"; echo $date['0'];
[/php]
выводит на экран мою дату в формате "2010-05-10", но нужно, чтобы эта дата находилась в переменной, т.е. чтобы потом вычислить timestamp.
strtotime('2010-05-10').
Или есть другой способ вычислить timestamp с даты формата "10 Мая 2010" не переводя её в "2010-05-10"?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ottaviano
ottaviano
сообщение 14.6.2010, 22:59; Ответить: ottaviano
Сообщение #10


strtotime - для етой функции ты можешь использовать свой вариант даты "10 мая 2010"
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Помогите вспомнить рекламного бота Телеграм для обмена рекламой
0 Mixatraider 678 21.2.2024, 23:42
автор: Mixatraider
Открытая тема (нет новых ответов) Как составить уравнение, чтобы назначить цену для товара?
0 rownong27 650 31.12.2023, 12:07
автор: rownong27
Открытая тема (нет новых ответов) Помогите рещить проблему с монитором.
Почему низкое разрешение при подключении монитора через displayport?
0 Levels 1693 11.12.2020, 0:48
автор: Levels
Открытая тема (нет новых ответов) Помогите кто нибудь получить партнерку Росбанк!
7 heisenberg_mw 2302 7.8.2020, 9:28
автор: heisenberg_mw
Открытая тема (нет новых ответов) Помогите найти тему пожалуйста
7 virtas 12373 24.7.2020, 17:02
автор: -JamesSmips-


 



RSS Текстовая версия Сейчас: 19.3.2024, 7:23
Дизайн