Как правильно проверить формат строки, если он соответствует формату номера версии? - PullRequest
1 голос
/ 11 марта 2019

У меня есть приложение PHP, которое получает данные приложения Play Store, и я хочу проверить, являются ли данные, которые я получаю, номером версии.

Номер версии может быть от 0.0.1 до 99.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 ]

4 голосов
/ 11 марта 2019

Простое регулярное выражение будет \d+\.\d+\.\d+.

Для php вы можете использовать preg_match .Проверьте пример по этой ссылке.

ps это не строгая проверка, так как версия должна быть не ниже 0.0.1 или не более 99.99.99.Он просто проверяет паттерн, как показано ниже.

<number><dot><number><dot><number><dot>
3 голосов
/ 11 марта 2019

Использование:

^(\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 голосов
/ 11 марта 2019

Предполагая, что, как ваши примеры в вашем вопросе, вы просто хотите точно соответствовать 3 наборам чисел (при условии, что они могут быть только 2 цифрами, содержащими только 0-9), проверьте мое решение здесь

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

Это, однако, имеет несколько проблем, так как не будет работать с менее чем 3 наборами цифр, теперь, если магазин воспроизведения не позволяет этого, прекрасно, но имейте в виду, что свышеуказанные номера версий регулярных выражений, такие как 1.0 и 1.1, не будут совпадать

2 голосов
/ 11 марта 2019

Если вы хотите установить нижний предел 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
1 голос
/ 11 марта 2019

Улучшение ответа shyammakwana.me , я бы предложил использовать:

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

Поскольку квантификатор + plus по умолчанию является жадным и будет соответствовать:

9999323.32532553.893588972350897327

А также:

1.1.1

Использование фигурных скобок позволяет вам быть более конкретным и определять, правильно ли отформатирована указанная версия.

Если вы хотите, вы можете избавиться от второго числа и просто использовать {1,}, чтобы сопоставить одно или несколько чисел.

1 голос
/ 11 марта 2019

Если вы просто взорвете точку (.), то максимальный размер каждого элемента ограничен 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...