[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Дата в регулярных выражениях
Skesh
Доброго времени суток всем, я слаб в регурярках еще, и нуждаюсь в помощи содания регулярного выражения для опредиления ввел ли пользовател дату, регулярка нужна для таких случаев:

1. два числа, точка, четыре числа (прим.: 11.2012)
2. два числа, точка, два числа (прим.: 31.11)
3. два числа, точка, два числа, точка, четыре числа (прим.: 30.11.2012)

регулярка нужна для каждого выражения отдельно, кто поможет тому + в карму smile.gif



Спустя 2 минуты, 55 секунд (27.03.2012 - 17:11) ADiel написал(а):
а проверить, что вернет strtotime не проще?

Спустя 3 минуты, 58 секунд (27.03.2012 - 17:15) Skesh написал(а):
ADiel strtotime не пойдет, дело в том что у меня есть поле поиска, куда пользователь дает не только запрос по дате, а и по другим текстовым и чисельным полям, и мне нужно "узнать" дату чтобы разбить ее на части и переделать в понятный запрос для БД.

Спустя 3 минуты, 51 секунда (27.03.2012 - 17:19) ADiel написал(а):
#(\d{2})\.(\d{2})#s 11.11
#(\d{2})\.(\d){4})#s 11.1111
#(\d{2})\.(\d{2})\.(\d{4})#s 11.11.1111

preg_math_all а потом проверяем элементы массива 1,2 и 1,2,3 (для последнего выражения)

Если несколько дат в строке, то
$matches[1][1], [1][2] итд...

Спустя 3 минуты, 49 секунд (27.03.2012 - 17:23) Skesh написал(а):
правильно?:
preg_match("#(\d){2}\.{\d}{2}#s", "$search");

$search - переменная в которой находится запрос.

Спустя 3 минуты, 5 секунд (27.03.2012 - 17:26) ADiel написал(а):
Да, но зачем кавычки?
<?php
$search = 'Поисковый запрос с датой 33.12';
preg_match_all("#(\d{2})\.(\d{2})#s", $search, $matches);
print_r($matches);


Array
(
[
0] => Array
(
[
0] => 33.12
)

[
1] => Array
(
[
0] => 33
)

[
2] => Array
(
[
0] => 12
)

)

Спустя 4 минуты, 10 секунд (27.03.2012 - 17:30) ADiel написал(а):
Лучше так
<?php
$search = 'Поисковый запрос с датой 33.12';
preg_match_all("#(\d{2})\.(\d{2})#s", $search, $matches, PREG_SET_ORDER);
print_r($matches);

/*

Array
(
[0] => Array
(
[0] => 33.12
[1] => 33
[2] => 12
)

)
*/


Специально в примере 33.12. Это намек на верицикацию после preg_math_all

Спустя 2 минуты, 38 секунд (27.03.2012 - 17:32) Winston написал(а):

Спустя 7 минут, 38 секунд (27.03.2012 - 17:40) Winston написал(а):
1. два числа, точка, четыре числа (прим.: 11.2012) - /^\d{2}\.\d{4}$/
2. два числа, точка, два числа (прим.: 31.11) - /^\d{2}\.\d{2}$/
3. два числа, точка, два числа, точка, четыре числа (прим.: 30.11.2012) /^\d{2}\.\d{2}\.\d{4}$/

Спустя 1 минута, 58 секунд (27.03.2012 - 17:42) ADiel написал(а):
Там поиск в тексте. Мне кажется, ^ и $ - лишнее, нет?

Спустя 1 минута, 33 секунды (27.03.2012 - 17:44) Winston написал(а):
Цитата (ADiel @ 27.03.2012 - 17:42)
Там поиск в тексте. Мне кажется, ^ и $ - лишнее, нет?

Ну для начала пусть покажет несколько примеров строки поиска.

Спустя 10 минут, 18 секунд (27.03.2012 - 17:54) ADiel написал(а):
Цитата
у меня есть поле поиска, куда пользователь дает не только запрос по дате, а и по другим текстовым и чисельным полям


Спустя 15 часов, 52 минуты, 42 секунды (28.03.2012 - 09:47) Skesh написал(а):
ну запрос можеть быть вида: "я чтото ищу" или "12.2011" или "документ 05.03.2012"

Спустя 4 минуты, 19 секунд (28.03.2012 - 09:51) Skesh написал(а):
вообщим то спс, всем +, разобрался кое как =)

Спустя 50 минут, 54 секунды (28.03.2012 - 10:42) killer8080 написал(а):
Skesh
мне кажется лучше сделать селекты под дату, чем парсить регулярками произвольный текст. Мало ли как юзеру в голову взбредет дату ввести. Всего не предусмотришь. В таком бардаке ногу сломишь. Что это за дата?
Цитата (Skesh @ 27.03.2012 - 16:08)
1. два числа, точка, четыре числа (прим.: 11.2012)

Как может быть дата из месяца и года без указания дня? blink.gif

Спустя 2 минуты, 9 секунд (28.03.2012 - 10:44) nugle написал(а):
killer8080
а может это день и год!? )))

Спустя 3 минуты, 16 секунд (28.03.2012 - 10:47) killer8080 написал(а):
Цитата (nugle @ 28.03.2012 - 09:44)
killer8080
а может это день и год!? )))

Ну так в том то и дело, не пойми что. Зачем создавать бардак, чтоб потом героически его разгребать. smile.gif

Спустя 11 минут, 11 секунд (28.03.2012 - 10:58) Skesh написал(а):
Цитата (killer8080 @ 28.03.2012 - 07:42)
Что это за дата?
Цитата (Skesh @ 27.03.2012 - 16:08)
1. два числа, точка, четыре числа (прим.: 11.2012)

Как может быть дата из месяца и года без указания дня? blink.gif

ну че у меня работает, идет выборка за 11 месяц 2012 года, довольно таки хорошо, у меня не такие завишеные потребности в поиске, тескт находит, дату находит, а сложных запросов не будет. Если брать в идеале то ты прав конечно, а для моего случая годится и так.

Спустя 4 минуты, 26 секунд (28.03.2012 - 11:03) Skesh написал(а):
Вот код для поиска, мож пригодится кому:

if (!empty($search))
{ $search=parseString($search);
if (preg_match("/^\d{2}\.\d{4}$/", $search))
{ $parts=explode(".",$search);
$search=$parts[1]."-".$parts[0];
}
if (preg_match("/^\d{2}\.\d{2}$/", $search))
{ $parts=explode(".",$search);
$search=$parts[1]."-".$parts[0];
}
if (preg_match("/^\d{2}\.\d{2}\.\d{4}$/", $search))
{ $parts=explode(".",$search);
$search=$parts[2]."-".$parts[1]."-".$parts[0];
}
}

$query="SELECT * FROM `$tab` WHERE `nazva` LIKE '%".$search."%' OR `nomer` LIKE '%".$search."%' OR `srok` LIKE '%".$search."%' OR `kontrol_srok` LIKE '%".$search."%' OR `rezoluciya` LIKE '%".$search."%' ORDER BY `$ORDERBY` $ASCDESC";


тут получается мы определяем дата ли в запросе и исчем либо текст либо дату, работает хорошо, если не изощрятся, а давать простые запросы.

Спустя 8 минут, 28 секунд (28.03.2012 - 11:11) Winston написал(а):
К тому же регулярка пропустит такие даты
99.99
99.99.9999
Потому думаю луче получать ч/м/г в массив и еще делать доп проверку с помощью http://ua2.php.net/manual/ru/function.checkdate.php

Спустя 9 минут, 21 секунда (28.03.2012 - 11:21) killer8080 написал(а):
Цитата (Skesh @ 28.03.2012 - 09:58)
ну че у меня работает, идет выборка за 11 месяц 2012 года, довольно таки хорошо, у меня не такие завишеные потребности в поиске, тескт находит, дату находит, а сложных запросов не будет. Если брать в идеале то ты прав конечно, а для моего случая годится и так.

А если он вместо этого введет 11.12? Тогда как? Это ноябрь 2012, 11 декабря или 12 ноября? Из-за такой неоднозначности пользователь может получить не верную выдачу поиска. Не лучше ли сразу все упорядочить?

Спустя 12 минут, 6 секунд (28.03.2012 - 11:33) Winston написал(а):
Цитата (killer8080 @ 28.03.2012 - 11:21)
А если он вместо этого введет 11.12?

Тогда это будет 11 часов 12 минут biggrin.gif

Спустя 4 дня, 1 час, 26 минут, 17 секунд (2.04.2012 - 12:59) Skesh написал(а):
killer8080 без сомнения прав.


_____________
*пускает слюну, глядя на код* :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.