2012-01-02 158 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}$/ 

将字符串与您拥有的日期模式匹配。