Subversion-Projekte lars-tiefland.php_share

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 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
 */
34
if (!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
?>