Довольно простой вопрос регулярных выражений в PHP - PullRequest
0 голосов
/ 03 июня 2009

Хорошо, я регулярное выражение dofus. Я только учусь достаточно, чтобы справиться со мной, но я хотел бы знать, как выполнить приведенное ниже регулярное выражение без использования троичного оператора php в середине. Также это может быть некрасиво, но это работает ...

'^". $date[0].(($date[0] == 0)?'?':'').$date[1]."[/.-]".$date[2].(($date[2] == 0)?'?':'').$date[3]."'";

ммм. как вы можете видеть, я использую троичный оператор, чтобы проверить, содержит ли дата 0. если она есть .. тогда ее можно игнорировать, если нет, то ее 1 или 2 и не игнорировать. я уверен, что есть способ написать это с помощью регулярных выражений? Если вы знаете, как тогда, пожалуйста, скажите мне, и я буду всегда благодарен. Кроме того, просто вам интересно, что это регулярное выражение в запросе MySQL.

Ответы [ 9 ]

2 голосов
/ 03 июня 2009

Вы ищете это? матч [1] - это месяц, матч [2] - день, а матч [3] - год

$regex = '#(0?[1-9]|1[0-2])[-/]([0-2]?[1-9]|3[01])[-/](19|20)?\d\d)#';

У вас здесь пара проблем.

Во-первых, никогда не помещайте текст в базу данных, если вы не уверены, что он отформатирован правильно. Тот факт, что даты находятся в базе данных с нулями и без, является проблемой. Почему в полях datetime нет дат, в которых база данных будет проверять правильность форматирования?

Во-вторых, приведенное выше регулярное выражение работает только в США, где используются даты «мм / дд / гггг». Поддержка других форматов даты невозможна, если вы привязаны к этому регулярному выражению.

В-третьих, почему вы делаете это в базе данных? Ваш пример: ГДЕ день рождения regex что-то .... Это означает, что у вас есть эта дата, прежде чем вы передаете ее в MySQL. Поэтому сначала исправьте дату в PHP:

$date = strtotime($_GET['date']);
$sql = "select blah From blah WHERE birthday = '$date' blah";
1 голос
/ 03 июня 2009

Там действительно нет простого способа упростить это. Проблема в том, что вы создаете регулярное выражение, которое заставляет вас тестировать на нуле, несмотря ни на что. Возможно, лучше преобразовать $ date в истинную дату с помощью mktime, а затем использовать ее в своем запросе.

<code>$date1 = mktime(0,0,0, substr($date, 0, 2), substr($date, 2, 2));
$sqlquery = "select * from table WHERE table_date == $date1";
0 голосов
/ 03 июня 2009

Отдельный вопрос о вашей цели нахождения на две недели раньше даты в базе данных. Откуда вы знаете, что пользователь вводит сначала день или месяц, если оба значения меньше 12? Для даты, такой как 1/5/06, как вы знаете, имел ли в виду пользователь 1 мая или 5 января? Я думаю, вам нужно решить это или, по крайней мере, принять решение, прежде чем вы сможете вычесть 14 дней.

0 голосов
/ 03 июня 2009

Не хочу, чтобы тебя понизили за то, что ты прыгнул на исправлении основной проблемы, но ...

Если у вас есть все эти различные форматы дат прямо сейчас, мне кажется, что это означает, что другие приложения хорошо работают с различными форматами и могут анализировать, понимать или, по крайней мере, представлять дату в любой форме, в которой она находится как строка. Таким образом, в качестве строки другие приложения, использующие эти данные, могут принимать их в любой из форм, в которых они сейчас находятся.

Так что мне кажется, что если бы все данные о дате продолжали быть строками, а просто оказались в одном конкретном макете (скажем, международный YYYY-MM-DD), то все остальные приложения были бы просто такой же счастливый формат, как и любой другой, и любой скрипт (например, ваш), который должен был проанализировать фактическое значение, мог бы сделать это проще.

Итак, мой вопрос: разрешено ли вам чистить и переформатировать строки, оставляя их в строках, чтобы они все выглядели одинаково? Я имею в виду запустить задание очистки перед вашим заданием (либо как отдельное задание обслуживания, либо непосредственно перед работой с данными), которое проверяет, соответствует ли дата вашему формату, и переформатирует ее и сохраняет ее в базе данных в виде строки в лучший формат, если это не так.

0 голосов
/ 03 июня 2009

Спасибо всем за ответы!

Несколько замечаний:
1) я не проектировал эту базу данных и не хотел вносить в нее какие-либо радикальные изменения.
2) Я очень хорошо знаю, как конвертировать строки в даты, и наоборот, и тому подобное.
3) я хочу знать, есть ли оператор / выражение регулярного выражения, который мог бы покончить с моим троичным оператором в середине его.

Я понимаю, что не очень ясно. У меня есть дни рождения всех форматов в базе данных, это большая база данных. Я извлекаю даты из базы данных за две недели до дня рождения клиента.
Так..! я беру текущую дату, добавляю 14 к ней, и у меня будет "17/06/09", это дата, которую мне нужно сравнить с датами 2000+ в базе данных. эта дата отформатирована красиво. Мне нравятся хорошие вещи. специально даты. хорошие свидания в любом случае ....

мне нужно проверить свою дату по mish mash в базе данных, и я знаю только один способ проверить это по базе данных -
А) вытащить каждую запись, правильно отформатировать дерьмовую дату и затем сравнить ее с моей (что я и делал ... очень интенсивно использую процессор)
Б) наличие в моем SQL-файле предложения регулярного выражения и получение только тех дат, которые соответствуют моим требованиям.

Моя логика звучит? Я надеюсь, что это так. Если нет, то, пожалуйста, укажите очевидное для меня, и я пришлю вам конфету *.




* Воображаемая конфета

0 голосов
/ 03 июня 2009

Хорошие ответы до сих пор с решениями регулярных выражений.

Вот еще один подход - использовать собственную функцию PHP strtotime () для нормализации строки. Он не идеален, но также не является решением регулярных выражений при работе со многими форматами, которые люди могут использовать в качестве дат.

Вот как я бы начал атаковать это:

<?php

// improve strtotime by eliminating dash ambiguity
function strtotimePlus($string) {
    $bads = array('-');
    $goods = array('/');
    return strtotime(str_replace($bads,$goods,$string));
}

// return date in fomat YYYY-MM-DD
function myDateFormat($timeformat) {
    return date("Y-m-d",$timeformat);
}

// convert free-form date string to YYYY-MM-DD
function betterDate($string) {
    return myDateFormat(strtotimePlus($string));

}

// samples from examples mentioned on the thread.
$dates = array();
$dates[] = "6/6/87";
$dates[] = "06/06/87";
$dates[] = "5.3.2001";
$dates[] = "5-2-82";
$dates[] = "1/1/83";

foreach($dates as $date) {
    print $date . " becomes " . betterDate($date) . "<br />";
}

Выход:

6/6/87 becomes 1987-06-06
06/06/87 becomes 1987-06-06
5.3.2001 becomes 2001-03-05
5-2-82 becomes 1982-05-02
1/1/83 becomes 1983-01-01
0 голосов
/ 03 июня 2009

У JDany есть лучшее решение, но вы ищете следующее правило:

    Month         /            Day               /     Year
(0?[1-9]|1[0-2])[/-](0?[1-9]|[1-2][0-9]|3[0-1])[/-](19|20)?\d\d)

Обратите внимание, что это регулярное выражение не обрабатывает / не проверяет ситуации, такие как:

  1. Месяцы и их соответствующие дни (т.е. 28, 30, 31 день)

  2. високосные годы

0 голосов
/ 03 июня 2009

Я бы рекомендовал не включать столько условной логики в один оператор, который генерирует регулярное выражение. Даже если бы был способ реализовать это как собственное выражение регулярного выражения, я сомневаюсь, что это будет более читабельным. Если цель состоит в том, чтобы сделать этот фрагмент более читабельным, я бы предложил условно выбрать между различными выражениями регулярных выражений или условно построить различные части в отдельных шагах, а затем соединить их вместе.

0 голосов
/ 03 июня 2009
for($i = 0; $i < 3; $i++) {
    $date[i] = preg_replace($date[i], '0', '');
}

Исчезает ноль.

Проверьте документацию PHP, в ней есть множество полезных функций. www.php.net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...