2012-04-18 2 views
3

Мне нужно сравнить две версии #, чтобы увидеть, если один из них больше, чем другой, и мне очень тяжело это делать.Как сравнить версию # внутри строки?

версия 1: [email protected] версия 2: [email protected]

Я попытался зачистки всех не цифровых символов так, я бы ушел с:

version1: 10101 version2: 970

который падает «а» от 10.1.0.a.1, так что не хорошо, и я пытался принимать все между «test_» и «@», затем вскрыши из ничего справа от подчеркивания «_» и самого символа подчеркивания, но затем мне еще нужно вырезать «V» в начале строки ING.

Даже если я могу перейти только к 10.1.0.a.1 и 9.7.0, как я могу сравнить эти два? Как я могу узнать, больше ли 10.1.0.a.1 больше 9.7.0? Если я удаляю десятичные знаки, я по-прежнему остаюсь с числовым символом в 1010a1, но мне нужен этот символ в случае, если версия выпуска, которую я сравниваю, равна 10.1.0.b.1, это будет больше, чем 10.1.0.a.1.

Это водит меня с орехами, кто-нибудь с этим имел дело? Как вы сравнили ценности? Я использую php.

ответ

4

Я думаю, вы хотите рассмотреть возможность работы с регулярным выражением, чтобы разобрать «число» части номеров версий - «10.1.0.a.1» и «9.7.0». После этого вы можете split от '.' для получения двух «массивов версий».

С помощью массивов версий вы выпадаете из них, пока не найдете более высокое число. Какой бы массив он ни был, это более высокий номер версии. Если какой-либо массив исчерпан, это меньший номер версии (если все остальные элементы не являются «0» или «а» или какой-либо семантикой, которую вы используете, чтобы сказать «базовую версию», например «10.0.0.a.0» == "10,0"). Если оба закончились одновременно, то они равны.

+0

+1 простое и эффективное решение – Scuzzy

+0

все решения будет работать, но это лучше, потому что я могу проверить «базовую» версию, прежде чем что-либо еще, и если базовая версия является то же я продолжаю дальше в версию. я просто надеюсь, что php будет сравнивать одиночные альфа-символы (как в b> a возвращает true) – user797963

1

Следующее регулярное выражение будет соответствовать все между "test_V" и "@example" и бросить его в массив $ матчей [1]

$pattern = '/test_V(.*?)(?:_.*?)[email protected]/i'; 
$string = 'version 1: [email protected] version 2: [email protected]'; 
if(preg_match_all($pattern,$string,$matches)) 
{ 
    print_r($matches[1]); 
} 

возвращает

Array 
(
    [0] => 10.1.0.a.1 
    [1] => 9.7.0 
) 

Это даст вы начинаете изучать, как вы хотите разделить свой довольно сложный номер версии.

3

Использование explode('.', $versionNum)

$ver1 = '10.1.0.a.1'; 
$ver2 = '10.1.0'; 
$arr1 = explode('.', $ver1); 
$arr2 = explode('.', $ver2); 

$min = min(count($arr1), count($arr2)); 

for ($i = 0; $i < $min; $i++) 
{ 
    if ($i + 1 == $min) 
     echo ($min == count($arr1)) ? $ver2 : $ver1; 
    if ($arr1[$i] > $arr2[$i]) 
    { 
     echo $ver1; 
     break; 
    } 
    elseif ($arr1[$i] < $arr2[$i]) 
    { 
     echo $ver2; 
     break; 
    } 
} 
Смежные вопросы