source: branches/version-2_5-dev/data/module/Compat/Compat/Function/version_compare.php @ 19792

Revision 19792, 6.3 KB checked in by Seasoft, 13 years ago (diff)

#744(PHP4 互換用途ソースを将来的に切り捨てやすい仕組みづくり)

Line 
1<?php
2// +----------------------------------------------------------------------+
3// | PHP Version 4                                                        |
4// +----------------------------------------------------------------------+
5// | Copyright (c) 1997-2004 The PHP Group                                |
6// +----------------------------------------------------------------------+
7// | This source file is subject to version 3.0 of the PHP license,       |
8// | that is bundled with this package in the file LICENSE, and is        |
9// | available at through the world-wide-web at                           |
10// | http://www.php.net/license/3_0.txt.                                  |
11// | If you did not receive a copy of the PHP license and are unable to   |
12// | obtain it through the world-wide-web, please send a note to          |
13// | license@php.net so we can mail you a copy immediately.               |
14// +----------------------------------------------------------------------+
15// | Authors: Philippe Jausions <Philippe.Jausions@11abacus.com>          |
16// |          Aidan Lister <aidan@php.net>                                |
17// +----------------------------------------------------------------------+
18//
19// $Id: version_compare.php,v 1.13 2005/08/01 12:21:14 aidan Exp $
20
21
22/**
23 * Replace version_compare()
24 *
25 * @category    PHP
26 * @package     PHP_Compat
27 * @link        http://php.net/function.version_compare
28 * @author      Philippe Jausions <Philippe.Jausions@11abacus.com>
29 * @author      Aidan Lister <aidan@php.net>
30 * @version     $Revision: 1.13 $
31 * @since       PHP 4.1.0
32 * @require     PHP 4.0.5 (user_error)
33 */
34if (!function_exists('version_compare')) {
35    function version_compare($version1, $version2, $operator = '<')
36    {
37        // Check input
38        if (!is_scalar($version1)) {
39            user_error('version_compare() expects parameter 1 to be string, ' .
40                gettype($version1) . ' given', E_USER_WARNING);
41            return;
42        }
43
44        if (!is_scalar($version2)) {
45            user_error('version_compare() expects parameter 2 to be string, ' .
46                gettype($version2) . ' given', E_USER_WARNING);
47            return;
48        }
49
50        if (!is_scalar($operator)) {
51            user_error('version_compare() expects parameter 3 to be string, ' .
52                gettype($operator) . ' given', E_USER_WARNING);
53            return;
54        }
55
56        // Standardise versions
57        $v1 = explode('.',
58            str_replace('..', '.',
59                preg_replace('/([^0-9\.]+)/', '.$1.',
60                    str_replace(array('-', '_', '+'), '.',
61                        trim($version1)))));
62
63        $v2 = explode('.',
64            str_replace('..', '.',
65                preg_replace('/([^0-9\.]+)/', '.$1.',
66                    str_replace(array('-', '_', '+'), '.',
67                        trim($version2)))));
68
69        // Replace empty entries at the start of the array
70        while (empty($v1[0]) && array_shift($v1)) {}
71        while (empty($v2[0]) && array_shift($v2)) {}
72
73        // Release state order
74        // '#' stands for any number
75        $versions = array(
76            'dev'   => 0,
77            'alpha' => 1,
78            'a'     => 1,
79            'beta'  => 2,
80            'b'     => 2,
81            'RC'    => 3,
82            '#'     => 4,
83            'p'     => 5,
84            'pl'    => 5);
85
86        // Loop through each segment in the version string
87        $compare = 0;
88        for ($i = 0, $x = min(count($v1), count($v2)); $i < $x; $i++) {
89            if ($v1[$i] == $v2[$i]) {
90                continue;
91            }
92            $i1 = $v1[$i];
93            $i2 = $v2[$i];
94            if (is_numeric($i1) && is_numeric($i2)) {
95                $compare = ($i1 < $i2) ? -1 : 1;
96                break;
97            }
98
99            // We use the position of '#' in the versions list
100            // for numbers... (so take care of # in original string)
101            if ($i1 == '#') {
102                $i1 = '';
103            } elseif (is_numeric($i1)) {
104                $i1 = '#';
105            }
106
107            if ($i2 == '#') {
108                $i2 = '';
109            } elseif (is_numeric($i2)) {
110                $i2 = '#';
111            }
112
113            if (isset($versions[$i1]) && isset($versions[$i2])) {
114                $compare = ($versions[$i1] < $versions[$i2]) ? -1 : 1;
115            } elseif (isset($versions[$i1])) {
116                $compare = 1;
117            } elseif (isset($versions[$i2])) {
118                $compare = -1;
119            } else {
120                $compare = 0;
121            }
122
123            break;
124        }
125
126        // If previous loop didn't find anything, compare the "extra" segments
127        if ($compare == 0) {
128            if (count($v2) > count($v1)) {
129                if (isset($versions[$v2[$i]])) {
130                    $compare = ($versions[$v2[$i]] < 4) ? 1 : -1;
131                } else {
132                    $compare = -1;
133                }
134            } elseif (count($v2) < count($v1)) {
135                if (isset($versions[$v1[$i]])) {
136                    $compare = ($versions[$v1[$i]] < 4) ? -1 : 1;
137                } else {
138                    $compare = 1;
139                }
140            }
141        }
142
143        // Compare the versions
144        if (func_num_args() > 2) {
145            switch ($operator) {
146                case '>':
147                case 'gt':
148                    return (bool) ($compare > 0);
149                    break;
150                case '>=':
151                case 'ge':
152                    return (bool) ($compare >= 0);
153                    break;
154                case '<=':
155                case 'le':
156                    return (bool) ($compare <= 0);
157                    break;
158                case '==':
159                case '=':
160                case 'eq':
161                    return (bool) ($compare == 0);
162                    break;
163                case '<>':
164                case '!=':
165                case 'ne':
166                    return (bool) ($compare != 0);
167                    break;
168                case '':
169                case '<':
170                case 'lt':
171                    return (bool) ($compare < 0);
172                    break;
173                default:
174                    return;
175            }
176        }
177
178        return $compare;
179    }
180}
181
182?>
Note: See TracBrowser for help on using the repository browser.