использование регулярных выражений в PHP для возврата части строки - PullRequest
2 голосов
/ 12 ноября 2011

Я пытаюсь извлечь только номер версии из строки, но строки не отформатированы в определенном виде. Например, строки могут быть записаны в (но не ограничиваясь этим) в любом из следующих форматов

  • "Angry Birds v2.0.0"
  • "Angry Birds 2.0.0"
  • "v1.25"
  • "Версия: 1.3"
  • "2.0.1"

Мне нужно создать функцию php, которая будет возвращать ТОЛЬКО номер версии (например: «2.0.0» из каждой из этих строк. Будет ли использование регулярных выражений вообще полезным в этой задаче? Если Итак, Какие встроенные в PCRE (совместимые с Perl регулярные выражения) функции PHP следует использовать ?

Пожалуйста, имейте в виду, что у меня очень мало понимания регулярных выражений. Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Попробуйте это:

function GetVersion($string)
{
    if (preg_match("#(\d+\.\d+(\.\d+)*)#", $string, $match)) {
        return $match[1];
    }
}

$test_strings = array(
    "Angry Birds v2.0.0",
    "Angry Birds 2.0.0",
    "v1.25",
    "Version: 1.3",
    " 2.0.1 ",
    "Dots4You v3.15"
);

foreach ($test_strings as $string) {
    printf("%s<br>", GetVersion($string));
}

РЕЗУЛЬТАТ:

2.0.0

2.0.0

1,25

1,3

2.0.1

*

3,15 * 1017

@ Тим Пицкер:

Ваш код потерпит неудачу, когда одно только имя проекта будет содержать цифру, например, «Dots4You v3.15» поймает «4» в качестве версии. Версия должна содержать не менее 2 цифр и 1 точки.

2 голосов
/ 12 ноября 2011

Это похоже на работу, для которой хорошо подходят регулярные выражения.

Например:

if (preg_match('/\d+(?:\.\d+)*/', $subject, $regs)) {
    $result = $regs[0];
} else {
    $result = "";
}

Объяснение:

\d+  # Match one or more digits
(?:  # Try to match...
 \.  # a dot
 \d+ # and one or more digits...
)*   # zero or more times.

Это также соответствует одиночным номерам версий, таким как «Acrobat Reader 9»;если вы не хотите этого и вам требуется хотя бы одна точка, просто используйте + вместо *: /\d+(?:\.\d+)+/

Или вы можете использовать привязку границы слова чтобы убедиться, что регулярное выражение никогда не совпадает с таким словом, как "Dots4You": /\d+(?:\.\d+)*\b/

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