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

时间:2019-04-11 13:25:29

标签: php regex

以下if语句有效,但很丑陋,我觉得使用preg_match REGEX可以实现相同的 。怎么样?

基本上我还不知道如何将正则表达式中的位数限制为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');
}

3 个答案:

答案 0 :(得分:3)

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

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

只需cast the string as an integer,然后检查范围。如果字符串不是有效数字,则强制类型转换会将其变为0。如果未设置该值,则null coalesce还将其变为零。

答案 1 :(得分:2)

这应该可以解决问题。当您将数字4放入花括号时,如果使用0,4,则只允许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
    }
}

答案 2 :(得分:1)

您可以使用内置的验证过滤器:

$opts = ['options' => ['min_range' => 2019, 'max_range' => 2025]];

if($date = filter_input(INPUT_GET, 'year', FILTER_VALIDATE_INT, $opts)) {
    //yes
}