Howdy_McGee
Howdy_McGee

Reputation: 10645

Test if String Given is A Version Number

Is there a way to test if a given string is a versioning number or not? I have some user input and I need to verify that the string being given to me can be used as a versioning number. I've seen that PHP has a version_compare() function but that looks like compareing two versions to one another.

I am assuming the given string should be a "PHP-Standardized" version.

Upvotes: 7

Views: 3838

Answers (3)

Lucas Bustamante
Lucas Bustamante

Reputation: 17188

$versions = [
    '1',
    '1.0',
    '1.001',
    '1.0.1',
    '1.00.1',
    '1.0.01',
    '10.0.1',
    '10.01.10',
    '1.0.0-beta',
    '1.0.0-rc1',
    '5.5.9-1ubuntu4.17',
    '\'DROP DATABASE',
    '1.2.3<script>xss</script>'
];

foreach ($versions as $version) {
    if (preg_match('#^(\d+\.)?(\d+\.)?(\d+)(-[a-z0-9]+)?$#i', $version, $matches) !== 0) {
        var_dump($matches[0]);
    } else {
        echo 'Could not find version number in string: ' . $version;
    }
    echo PHP_EOL;
}

Result:

string(1) "1"
string(3) "1.0"
string(5) "1.001"
string(5) "1.0.1"
string(6) "1.00.1"
string(6) "1.0.01"
string(6) "10.0.1"
string(8) "10.01.10"
string(10) "1.0.0-beta"
string(9) "1.0.0-rc1"
Could not find version number in string: 5.5.9-1ubuntu4.17
Could not find version number in string: 'DROP DATABASE
Could not find version number in string: 1.2.3<script>xss</script>

Upvotes: 2

Howdy_McGee
Howdy_McGee

Reputation: 10645

I'm not sure if this is the best way but using the version_compare() I just ensured that it was at least 0.0.1 by filtering out 'non-version' strings:

version_compare( $given_version, '0.0.1', '>=' )

For example:

if( version_compare( $_POST['_plugin_vers'], '0.0.1', '>=' ) >= 0 ) {
    echo 'Valid Version';
} else {
    echo 'Invalid Version';
}

Upvotes: 11

ymakux
ymakux

Reputation: 3485

if(preg_match('/^(\d+\.)?(\d+\.)?(\*|\d+)$/', $string)){
  echo 'Valid';
} else {
  echo 'Invalid';
}

Upvotes: 3

Related Questions