2012-01-02 141 views
1

基本上我有兩個選擇:如何區分SHA1字符串和日期時間字符串?

$one = "fdfeb16f096983ada02db49d46a8154475d700ae"; 
$two = "2011-12-28 05:20:01"; 

我需要某種形式的正則表達式,這樣我就可以檢測羯羊字符串遵循$one的圖案或$two

模式檢測,如果該字符串是sha1或日期時間。

什麼是最好的方法來確定這一點?

由於

+0

「$ 1」只是一個固定長度的[n全小寫]十六進制字符串。如果你*嘗試過*你已經有了答案。 (像'[a-fA-F0-9] {40}'。)根據「$ 2」做了什麼,我會試圖將它轉換爲日期/時間,如果失敗,我會拒絕它,儘管正則表達式是相對平凡的。再次,如果你嘗試了某些東西,它已經被解決了。 – 2012-01-02 05:07:40

+0

@pst - 是啊我嘗試了一些東西,我沿着'/^[0-9a-f] {40} $/i'的方向行事 - 我不知道爲什麼你要在你的正則表達式中包含AF你可以簡單地使用'i'來區分大小寫。我只是想找一個更好的方法來做到這一點。感謝您的推定。 – Latox 2012-01-02 05:31:47

+1

@Latox,擱置一邊,發佈你已經嘗試過的以及做過和沒有做過的事情是一個好主意。 SO充滿了懶惰的問題,人們往往認爲最糟糕的。無論如何,展示你的工作有助於我們更好地回答你的問 – 2012-01-02 06:10:36

回答

0
if (preg_match($one, $string) { 
    echo "$string matches $one"; 
} else if (preg_match($two, $string) { 
    echo "$string matches $two"; 
} 
5

如果你是絕對確保這些都是ONLY兩種選擇,我會去的strlen,而不是某種奇妙的正則表達式的。
即使這些不是唯一的兩個選項(用戶搞砸了),我仍然會用strlen,然後專門檢查每種格式,如果它是你期望的。

+0

這不是一個複雜的問題。在這種情況下,通過簡單的detect-if-sha1,我沒有看到只有「$ one」字符串長度的優勢。 – 2012-01-02 05:18:15

+0

@pst我的思維方式是任何問題,你可以用一個簡單的函數(strlen/isset/strpos/count等)解決是一個更好的方法,然後是reg-exp,這很難維護,並且可能(儘管不重要大多數情況下)較慢。例如,數組/字符串的長度和/或數量被緩存在zval =>非常芯片中以獲得這些值。 – 2012-01-02 05:35:01

+1

我沒有看到任何維護方案,其中長度檢查是優越的,但有幾個維護方案比較差(例如,格式更改或添加了其他格式)。我會補充說,在全部大寫的「絕對」和「唯一」的情況下強烈表明這不是最好的解決方案。爲什麼在不容易做出假設的時候呢?使用正則表達式,如果輸入意外,至少可以記錄錯誤。 – 2012-01-02 07:18:49

0

條件與正則表達式匹配每個選項。對於第二種情況:

if(preg_match('|(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}|',$two) 
{ 
    echo "Matching two"; 
} 

我沒有看到一個數字圖案清晰,但你可以做ELSEIF(S)來檢測其他潛在案件。

2

我不知道如何在PHP應用正則表達式,但假設實際的正則表達式是不夠......由A-F或0-9的

/^[a-f0-9]{40}$/ 

比賽40個字符。 ^和$匹配字符串的開頭和結尾,所以沒有別的可以在其中。

/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/ 

將字符串與您擁有的日期模式匹配。