使用PHP中的正则表达式返回字符串的一部分

时间:2011-11-11 22:25:09

标签: regex string substring

我正在尝试仅从字符串中检索版本号,但字符串未按特定格式进行格式化。例如,字符串可以写入(但不限于)以下任何格式

  • “愤怒的小鸟v2.0.0”
  • “愤怒的小鸟2.0.0”
  • “V1.25”
  • “版本:1.3”
  • “2.0.1”

我需要创建一个只返回版本号的php函数(例如:来自每个字符串的“2.0.0”。使用正则表达式在这个任务中是否有用?如果是这样,内置PCRE(perl兼容的正则表达式)PHP函数应该使用吗?

请记住,我对正则表达式的理解很少。谢谢!

2 个答案:

答案 0 :(得分:3)

试试这个:

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

@Tim Pietzcker:

当项目名称单独包含数字时,您的代码将失败,例如“Dots4You v3.15”将捕获“4”作为版本。版本应包含至少2位数和1个点。

答案 1 :(得分:2)

这听起来像是正则表达式非常适合的工作。

例如:

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+)+/

或者,您可以使用word boundary anchor来确保正则表达式在“Dots4You”之类的单词中永远不匹配:/\d+(?:\.\d+)*\b/