好的,我是一个正则表达式doofus。我只学到了足够的东西让我过去,但我想知道如何在不使用php三元运算符的情况下执行下面的正则表达式。它也可能很丑,但它有效......
'^". $date[0].(($date[0] == 0)?'?':'').$date[1]."[/.-]".$date[2].(($date[2] == 0)?'?':'').$date[3]."'";
嗯。你可以看到我使用三元运算符来测试日期是否包含0.如果它确实..那么它可以被忽略,如果不是那么它的1或2并且不要忽略。我确定有一种方法可以用正则表达式来编写这个吗?如果你知道怎么回事请告诉我,我将永远是伟大的。另外,只是想知道这是mysql查询中的正则表达式。
答案 0 :(得分:2)
$regex = '#(0?[1-9]|1[0-2])[-/]([0-2]?[1-9]|3[01])[-/](19|20)?\d\d)#';
这里有几个问题。
首先,永远不要将文本放入您未确定格式正确的数据库中。日期在数据库中有和没有0的事实是一个问题。为什么日期时间字段中的日期不是数据库确保它们的格式正确?
其次,上面的正则表达式仅适用于使用'mm / dd / yyyy'日期的美国。如果您与该正则表达式绑定,则无法支持其他日期格式。
第三,你为什么要在数据库中这样做?你的例子是WHERE生日正则表达式....这意味着你在将它传递给mySQL之前有这个日期。所以先用PHP修复日期:
$date = strtotime($_GET['date']);
$sql = "select blah From blah WHERE birthday = '$date' blah";
答案 1 :(得分:1)
真的没有简单的方法可以简化这一点。问题是你正在构建一个正则表达式,迫使你无论如何都要测试零。您可能最好使用mktime将$ date转换为真实日期,然后在查询中使用该日期。
$date1 = mktime(0,0,0, substr($date, 0, 2), substr($date, 2, 2));
$sqlquery = "select * from table WHERE table_date == $date1";
答案 2 :(得分:0)
for($i = 0; $i < 3; $i++) {
$date[i] = preg_replace($date[i], '0', '');
}
消失任何零。
查看PHP文档,它有很多不错的功能。 www.php.net
答案 3 :(得分:0)
我建议不要在生成正则表达式的单个语句中内置这么多条件逻辑。即使有一种方法将其作为本地正则表达式实现,我怀疑它会更具可读性。如果目标是使这个片段更具可读性,我建议有条件地在不同的正则表达式之间进行选择,或者在不同的步骤中有条件地构建各个部分,然后将它们拼接在一起。
答案 4 :(得分:0)
JDany有一个更好的解决方案,但您正在寻找的正则表达式是:
Month / Day / Year
(0?[1-9]|1[0-2])[/-](0?[1-9]|[1-2][0-9]|3[0-1])[/-](19|20)?\d\d)
请注意,此正则表达式不处理/验证诸如以下情况:
月份及其相应日期(即28,30,31天)
闰年
答案 5 :(得分:0)
到目前为止,使用正则表达式解决方案做出了很好的回应。
这是另一种方法 - 使用本机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
答案 6 :(得分:0)
谢谢你的回答!
有几点需要注意:
1)我没有设计这个数据库,也不想对它做出任何重大改变
2)我非常清楚如何将字符串转换为日期,反之亦然,以及所有爵士乐
3)我想知道的是,是否有一个正则表达式运算符/表达式可以在其中间取消我的三元语句。
我意识到我并不是很清楚。我有数据库中所有格式的生日,它是一个大型数据库。我在客户生日前两周将日期从数据库中提取出来 所以..!我把当前的日期添加到它14,我将有“17/06/09”这是我需要检查数据库中的2000多个日期的日期。这个日期的格式很好。我喜欢好东西。特别约会。美好的约会。反正....
我需要在数据库中检查我的日期与mish mash,我知道对数据库进行检查的唯一方法是通过
A)拉出每条记录,正确格式化蹩脚的日期,然后检查它(我正在做的...非常cpu密集)
B)在我的sql中有一个正则表达式子句,只检索符合我规范的日期。
我的逻辑是否合理?希望如此。如果没有,那么请向我指出显而易见的事情,我会给你发一些糖果*。
*想象中的糖果
答案 7 :(得分:0)
不要因为跳过修复底层问题而被贬低,但是......
如果您现在拥有所有这些不同的日期格式,那么在我看来,这意味着其他应用程序可以使用不同的格式,并且可以解析,理解或至少以任何形式呈现日期作为串。因此,作为字符串,使用此数据的其他应用程序可以接受它现在所使用的任何形式。
所以在我看来,如果所有日期数据都是字符串,但恰好都是在一个特定的布局中(比如国际YYYY-MM-DD),所有其他应用程序都只是对于这种格式和其他格式一样满意,任何必须解析实际值的脚本(如你的)都可以更简单地完成。
所以,我的问题是,你是否允许擦洗并重新格式化字符串,保持字符串,所以它们看起来都一样?我的意思是在你的工作之前运行一个清理工作(作为一个单独的维护任务,或者在你处理数据之前),它检查一个日期是否是你的格式,并重新格式化它并将其作为字符串存储在数据库中如果不是最好的格式。
答案 8 :(得分:0)
一个单独的问题,关于您的目标是在数据库中提前两周找到它。如果两个值都小于12,您如何知道用户首先输入一天或一个月?对于像1/5/06这样的日期,您如何知道用户是指1月1日还是1月5日?我认为你必须先解决这个问题,或至少做出决定,然后才能减去14天。