要检查变量的 Ifs 太多,实际上包含有效的 4 位数字年份



以下 if 语句有效,但它很丑陋,我有一种感觉,使用 REGEX preg_match也可以实现同样的效果。如何?

基本上我不知道如何在正则表达式中将位数限制为 4。一旦满足 4 位数字标准,我想将 true 的回报限制在 2019 年至 2025 年之间。

示例正则表达式:

/* digits only, no dots */
function is_digits($element) {
    return !preg_match ("/[^0-9]/", $element);
}

示例 PHP

// SET $TARGET_YEAR TO current year in [yyyy] format.
// Is set, Is not empty, Is numeric, Is 4 digits long?
if(isset($_GET["year"]) && !empty($_GET["year"]) && is_numeric($_GET["year"]) && strlen($_GET["year"]) == 4) {
  // WE HAVE A REAL YEAR.
  // SET $TARGET_YEAR TO target year in [yyyy] format.
  self::$TARGET_YEAR = $_GET["year"];
} else {
  // WE DON'T HAVE A REAL YEAR.
  // SET $TARGET_YEAR TO current year in [yyyy] format.
  self::$TARGET_YEAR = date('Y');
}

对于这种简单的检查,不需要正则表达式。您现有的代码可以简化为:

$year = (int)$_GET["year"] ?? 0;
if ($year >= 2019 && $year <= 2025) {
    // do stuff
}

只需将字符串转换为整数,然后检查范围。如果字符串不是有效的数字,则强制转换会将其转换为 0。如果未设置该值,则空合并也会将其变为零。

这应该可以解决问题。当您输入大括号数字 4 时,如果您使用 4,0,4,它将允许 0 到 4 位数字。

/* digits only, no dots */
function is_digits($element) {
    $element = preg_match ("/^[0-9]{4}$/", $element);
    if($element > 2019 && $element < 2025) {
       return true; //Or $element
    } else {
       return false; //Or something else you want
    }
}

您可以使用内置的验证筛选器:

$opts = ['options' => ['min_range' => 2019, 'max_range' => 2025]];
if($date = filter_input(INPUT_GET, 'year', FILTER_VALIDATE_INT, $opts)) {
    //yes
}

最新更新