有没有更好的方法来编写这个IF语句?

时间:2011-10-26 10:23:59

标签: php if-statement

if($colour && 
      ((strlen($colour) == 7 && preg_match("/#[0-9a-fA-F]{6}/",$colour)) ||
       (strlen($colour) == 4 && preg_match("/#[0-9a-fA-F]{3}/",$colour)))) {
  • 如果$ color的值为 AND
    • $ color是一个7位数的字符串,符合7位十六进制颜色格式 OR
    • $ color是一个4位数的字符串,符合4位十六进制颜色格式

(字符串长度包括hash,因此3& 6变为4& 7)

5 个答案:

答案 0 :(得分:1)

是的,有。如果你使用RegEx,你也可以使用一个正则表达式,就像这样。通过使用字符串 anchors 的start或string / end,也可以跳过长度。

if ($colour && preg_match("/^#([0-9a-fA-F]){3}(([0-9a-fA-F]){3})?$/", $colour)
{
}

我认为可以跳过“检查价值”,但这可能是一种优化。

[编辑]

结果证明是RegEx cheat sheet上的一个例子。

答案 1 :(得分:1)

让正则表达式通过添加字符串的^和$ signs信号开始/结束并组合正则表达式来检查字符串的长度:

if (preg_match("/^#[0-9a-fA-F]{3}|#[0-9a-fA-F]{6}$/", $colour)) {

答案 2 :(得分:1)

if (preg_match("/^#([0-9a-f]{3}){1,2}$/i", $colour)) {

对我来说似乎足够了。

答案 3 :(得分:0)

您可以使用^$来锚定正则表达式,这样就隐含了长度。

if( $colour && 
    (  preg_match("/^#[0-9a-fA-F]{6}$/",$colour)
    || preg_match("/^#[0-9a-fA-F]{3}$/",$colour)
  ) ) {

我不太了解php,但在perl中你需要将$转义为\$或使用单引号代替。

答案 4 :(得分:-1)

您的正则表达式已经指定了蜇伤长度,因此如果您设置了开始^并结束$边界,则无需进行检查:

if ( preg_match("/^#[0-9a-fA-F]{6}$/", $colour) || preg_match("/^#[0-9a-fA-F]{3}$/",$colour) ) {}