我正在尝试仅从字符串中检索版本号,但字符串未按特定格式进行格式化。例如,字符串可以写入(但不限于)以下任何格式
我需要创建一个只返回版本号的php函数(例如:来自每个字符串的“2.0.0”。使用正则表达式在这个任务中是否有用?如果是这样,内置PCRE(perl兼容的正则表达式)PHP函数应该使用吗?
请记住,我对正则表达式的理解很少。谢谢!
答案 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/