簡體   English   中英

PHP中非常簡單的正則表達式問題

[英]Fairly simple regex question in PHP

好吧,我是regex doofus。 我只學過足夠的知識,但是我想知道如何在不使用php三元運算符的情況下執行以下正則表達式。 另外它可能很難看,但是可以用...

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

如您所見,im使用三元運算符測試日期是否包含0。如果包含,則可以忽略,如果不包含則為1或2,請不要忽略。 我確定只有正則表達式可以寫這種方法嗎? 如果您知道怎么辦,請告訴我,我將永遠幸福。 另外,以防萬一您想知道這是mysql查詢中的正則表達式。

您在找這個嗎? match [1]是月份,match [2]是日期,match [3]是年份

$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";

確實沒有任何簡單的方法可以簡化此過程。 問題在於您正在構建一個正則表達式,無論如何都將強制您對零進行測試。 您最好用mktime將$ date轉換為真實日期,然后在查詢中使用它。

$date1 = mktime(0,0,0, substr($date, 0, 2), substr($date, 2, 2));
$sqlquery = "select * from table WHERE table_date == $date1";

for($i = 0; $i < 3; $i++) {
    $date[i] = preg_replace($date[i], '0', '');
}

那消失為零。

查看PHP文檔,它有很多不錯的功能。 www.php.net

我建議不要在生成正則表達式的單個語句中內置太多條件邏輯。 即使有一種方法可以將其實現為本地正則表達式,我也懷疑它是否更具可讀性。 如果目標是使此片段更具可讀性,我建議有條件地在不同的regex表達式之間進行選擇,或有條件地在不同的步驟中構建各個部分,然后將它們縫合在一起。

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. 閏年

到目前為止,使用正則表達式解決方案的反應良好。

這是另一種方法-使用本地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

謝謝大家的答案!

注意事項:
1)我沒有設計這個數據庫,也不想對它做任何大的改變。
2)我非常了解如何將字符串轉換為日期,反之亦然以及所有爵士樂。
3)我想知道的是是否有一個正則表達式運算符/表達式可以消除中間的三元語句。

我意識到我不是很清楚。 數據庫中有各種格式的生日文件,數據庫很大。 我要在客戶生日前兩周從數據庫中取出日期。
所以..! 我將當前日期加上14,就得到“ 17/06/09”,這是我需要對照數據庫中2000多個日期進行檢查的日期。 這個日期的格式很好。 我喜歡美好的事物。 特別是日期。 美好的約會。 無論如何....

我需要根據數據庫中的Mash mash檢查日期,而我知道根據數據庫進行檢查的唯一方法是
A)拉出每條記錄,正確格式化糟糕的日期,然后對照我的進行檢查(這是我正在做的...占用大量CPU)
B)在我的sql中有一個regex子句,並且僅檢索符合我的規范的日期。

我的邏輯健全嗎? 希望如此。 如果沒有,請給我指出明顯的地方,我會給你一些糖果*。




*假想糖果

並不是要因解決基本問題而心灰意冷,而是...

如果您現在具有所有這些不同的日期格式,在我看來,這意味着其他應用程序可以使用不同的格式,並且可以解析,理解或至少以字符串形式顯示日期。 因此,作為字符串,使用此數據的其他應用程序可以以現在使用的任何形式接受它。

因此在我看來,如果所有日期數據都繼續為字符串,但恰好全部都位於一種特定的布局中(例如國際YYYY-MM-DD),那么其他所有應用程序都將同樣滿意這種格式和其他格式一樣,必須解析實際值的任何腳本(例如您的腳本)都可以更簡單地實現。

因此,我的問題是,是否允許您擦洗並重新格式化字符串,使其保持字符串狀態,以使它們看起來都一樣? 我的意思是在工作之前運行清理作業(作為單獨的維護任務,或者就在使用數據之前),該清理作業檢查日期是否為您的格式,然后將其重新格式化並以字符串形式存儲在數據庫中如果不是,則為最佳格式。

關於您要在數據庫中的日期之前兩周找到目標的問題。 如果兩個值都小於12,您怎么知道用戶首先輸入一天還是一個月? 對於1/5/06這樣的日期,您如何知道用戶是5月1日還是1月5日? 我認為您必須解決這個問題,或者至少要對此做出決定,然后再減去14天。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM