仅获取PHP版本号

6

I've been using this...

echo PHP_VERSION;

用于显示服务器上正在运行的PHP版本,通常会显示类似于...

5.4.6.1

但是我刚刚发现在一些服务器上,不仅会显示版本号,而且还会显示这样的内容:
5.4.6.1ububtu1.8

有没有办法只获取数字?

原因是我需要检查PHP的版本并显示一条消息,例如...

$phpversion = PHP_VERSION;
if($phpversion >= "5.5") {
    echo "All good";
} else {
    echo "Your version of PHP is too old";
}

如果$phpversion包含除数字以外的任何内容,那么这个脚本将无法正常工作。

提前感谢。


6
查看手册从来都不是一个坏主意。点击链接查看。 - RiggsFolly
7个回答

9
获取完整版本(5.4.6.1)
  <?php
    preg_match("#^\d+(\.\d+)*#", PHP_VERSION, $match);
    echo $match[0];

在你的例子中,它将返回5.4.6.1。为了获得所需的版本(5.4),请按如下操作:
preg_match("#^\d.\d#", "5.4.6.1ububtu1.8", $match);
echo $match[0];        

在你的例子中,它将返回5.4。

在这里测试


此正则表达式无法处理每个子版本中的多个数字。甚至在给定的示例中它都失败了:从数值上来说,5.4.6.1ububtu1.8应该是5.4.6.1,但您的正则表达式却返回了 5.4.6 。更好的模式应该是 ^\d+(\.\d+)*,或者甚至只是 ^[0-9.]+ - Mr. DOS
是的,我提供了这个正则表达式只显示3位数字,因为他只需要前两位来比较php版本 :) - AKRAM EL HAMDAOUI
他需要前三个数字,而不是前三个数字位。例如,将“5.4.20”输入您的正则表达式 - 它将输出“5.4.2”。 - Mr. DOS

7

以下内容来自文档中的示例(这里这里):

if (version_compare(phpversion(), '5.5.0', '>=')) {
    echo "All good";
} else {
    echo "Your version of PHP is too old";
}

测试脚本:

 <?php

 echo PHP_VERSION;
 echo PHP_EOL;
 echo phpversion();
 echo PHP_EOL;
 echo version_compare(phpversion(), '5.5.0', '>=') ?: "false";
 echo PHP_EOL;
 echo version_compare(phpversion(), '5.6.0', '>=') ?: "false";
 echo PHP_EOL;
 echo version_compare(phpversion(), '5.7.0', '>=') ?: "false";
 echo PHP_EOL;
 echo version_compare('5.4.6.1ububtu1.8', '5.4.0', '>=') ?: "false";
 echo PHP_EOL;
 echo version_compare('5.4.6.1ububtu1.8', '5.5.0', '>=') ?: "false";
 ?>

输出:

$ php test.php
5.6.4-1+deb.sury.org~trusty+1
5.6.4-1+deb.sury.org~trusty+1
1
1
false
1
false

1
虽然对于"5.5.0ubuntu"来说版本太旧了。 - Elin
尝试运行 echo version_compare('5.4.6.1ububtu1.8', '5.4.6.1', '>=') ?: "false"; - Elin
5.4.6.1不是语义化版本号,所以当然不能工作。版本号应该是<major>.<minor>.<patch>,因此多出来的'.1'在version_compare的眼中变得毫无意义,因为它不是一个有效的版本号。 - Samsquanch
好的,请告诉原帖作者,因为这是他报告的格式。verson_compare有处理“extras”的功能。这就是他所问的问题,当末尾有额外内容时,进行基于字符串比较的比较。当版本至关重要且您不知道操作系统是否附加字符串时,这是一个非常容易陷入的陷阱。 - Elin
1
但是5.4.6.1不是一个有效的语义版本号(并不一定非得是这样)。他发布了这个作为PHP_VERSION输出的例子,这不是他所询问的。他想知道如何判断版本是否大于5.5,而我的回答解决了这个问题。为了确保万无一失,echo version_compare('5.4.6.1', '5.4.0', '>=') ?: "false";打印出1。 - Samsquanch

4

PHP提供了一个方便的函数version_compare,用于比较类似SemVer的版本号。虽然您可以手动进行大量字符串操作,但我认为在您的使用情况下,利用内置函数可以让您的生活更加轻松。


1

几天前我遇到了同样的问题,后来在PHP文档中找到了这个代码片段。

// PHP_VERSION_ID is available as of PHP 5.2.7, if our 
// version is lower than that, then emulate it
if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);

    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}

现在,PHP_VERSION_ID 常量包含您想要的内容。
链接这里

1

0
你可以这样做。
echo filter_var(PHP_VERSION, FILTER_SANITIZE_NUMBER_FLOAT,
FILTER_FLAG_ALLOW_FRACTION);

第二个参数将根据 FLOAT 表示法对结果进行清理,第三个参数允许像“DOT”一样的小数。

您可能想要查看 PHP 手册- 清理过滤器


0
你可以使用 PHP 的变量操作功能来检查特定版本:
<?php
$v=PHP_VERSION;
echo "RAW: ".$v.PHP_EOL;

$n=$v+0;
echo "MANGLED: ".$n.PHP_EOL;

echo "CONSTANT DIRECTLY  MANGLED: ".(PHP_VERSION+0).PHP_EOL;

$u="5.4.6.1ububtu1.8";

echo "From string: ".$u.PHP_EOL;
$nu=$u+0;
echo "From mangled string: ".$nu.PHP_EOL;

输出:

$: ~/test> php -f v.php 
RAW: 5.5.24
MANGLED: 5.5
CONSTANT DIRECTLY  MANGLED: 5.5
From string: 5.4.6.1ububtu1.8
From mangled string: 5.4
$: ~/test>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接