如果字符串格式遵循版本号格式,如何正确检查?

时间:2019-03-11 13:09:07

标签: php regex

我有一个PHP应用程序,其中有一个Play商店应用程序数据,我想检查获取的数据是否是版本号。

版本号可以是0.0.199.99.99,否则我可能对版本号限制有误。

如何正确使用正则表达式来处理这项工作?

这是我目前的操作方式:

$list = ["hello", "0.23.2", "world"];

foreach($list as $l) {
    if (checkIfValidVersion($l)) {
       echo "valid version!";
    }
}

function checkIfValidVersion ($someString) {
    $split = explode(".", $someString);
    $isValid = false;

    foreach($split as $s) {
        $isValid = is_numeric($s) ? true : false;
    }

    return $isValid;
}

6 个答案:

答案 0 :(得分:4)

简单的正则表达式为\d+\.\d+\.\d+

对于php,您可以使用preg_match。在此链接上查看示例。

p.s。这不是严格的检查,例如版本应至少为0.0.1或最大值应为99.99.99。它只是检查如下所示的模式。

<number><dot><number><dot><number><dot>

答案 1 :(得分:3)

假设作为问题中的示例,您只想精确匹配3组数字(假设它们只能是仅包含0-9的2位数字),请检查我的解决方法here

[0-9]{1,2}\.[0-9]{1,2}\.?[0-9]{1,2}

但是,这有一些问题,因为它不能用于少于3组数字,现在,如果Play商店不允许这样做,那就太好了,但是请注意,使用上述正则表达式版本号(例如1.0和1.1不匹配

答案 2 :(得分:3)

使用:

^(\d?\d)\.(\d?\d)\.(\d?\d)$

该正则表达式将匹配由点分隔的三组1或2位数字。最好将^$preg_match一起使用,以确保它将匹配整个字符串,而不匹配包含版本部分的字符串,例如something1.0.0something

示例:

preg_match("/^(\d?\d)\.(\d?\d)\.(\d?\d)$/", "1.0.0"); // Match
preg_match("/^(\d?\d)\.(\d?\d)\.(\d?\d)$/", "99.99.99"); // Match
preg_match("/^(\d?\d)\.(\d?\d)\.(\d?\d)$/", "99.699.99"); // Not match

答案 3 :(得分:2)

如果您想实施0.0.1的下限,则可以使用:

<?php
function is_valid_version( $version )
{
    // Assume the input is invalid
    $return = false;

    // Make sure we can explode() the input
    if( is_scalar( $version ) )
    {
        // Explode on periods
        $version = explode( '.', (string)$version );

        // We should have exactly items
        if( count( $version ) === 3 )
        {
            // All three items should be digits
            if(
                ctype_digit( $version[ 0 ] ) &&
                ctype_digit( $version[ 1 ] ) &&
                ctype_digit( $version[ 2 ] )
            )
            {
                // At least one digit needs to not be zero
                // 0.0.0 should be invalid
                // If you want the upper limit to be 99.99.99 then this is where you should do it
                if(
                    (int)$version[ 0 ] !== 0 ||
                    (int)$version[ 1 ] !== 0 ||
                    (int)$version[ 2 ] !== 0
                )
                {
                    $return = true;
                }
            }
        }
    }

    return $return;
}

var_dump( is_valid_version( '1.2.3' ) ); // true
var_dump( is_valid_version( '0.0.0' ) ); // false
var_dump( is_valid_version( '0.0.1' ) ); // true
var_dump( is_valid_version( '0.1.0' ) ); // true
var_dump( is_valid_version( '100.53456.fgdf' ) ); //false
var_dump( is_valid_version( array() ) ); //false

答案 4 :(得分:1)

如果仅爆炸点(.),则每个项目的最大长度限制为2。

$version = "25.22.01";
$bool = true;
foreach(explode(".", $version) as $part) {
  if(strlen($part) > 2) {
    $bool = false;
  }
}

// Expected result: "true"
var_dump($bool);

这是3v4l.org上的一个有效示例。

答案 5 :(得分:1)

对于shyammakwana.me的答案,我建议使用:

\d{1,2}\.\d{1,2}\.\d{1,2}

因为+加修饰符在默认情况下是贪婪的,并且会匹配:

9999323.32532553.893588972350897327

以及:

1.1.1

使用花括号可以使您更加具体,并确定指定版本的格式是否正确。

如果愿意,您可以摆脱第二个数字,而只需使用{1,}来匹配一个或多个数字。