-
Notifications
You must be signed in to change notification settings - Fork 7
/
Matchers.php
63 lines (55 loc) · 3.02 KB
/
Matchers.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license.
*/
declare(strict_types=1);
namespace Roave\SecurityAdvisories;
/**
* @see https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
*
* @fixme: throw this garbage away and use existing regexp from semver.org
*/
final class Matchers
{
// pattern that matches full version only, without boundary sign
public const TAGGED_VERSION_MATCHER = '\s*(?<version>(?:\d+\.)*\d+)' .
'(?:-' . // dash is required for correct version
'(?<flag>stable|beta|b|rc|alpha|a|patch|p)' .
'[._-]?' .
'(?<stability_numbers>(?:\d+\.)*\d+)?' .
')?\s*';
private const UNTAGGED_VERSION_MATCHER = '((?:\d+\.)*\d+)' .
'(?:-' .
'(stable|beta|b|rc|alpha|a|patch|p)' .
'[._-]?' .
'((?:\d+\.)*\d+)?' .
')?';
// pattern that ensures we have a correct boundary in the right place
public const BOUNDARY_MATCHER = '/^\s*(?<boundary><|<=|=|>=|>)\s*' .
self::TAGGED_VERSION_MATCHER .
'\s*$/';
public const CLOSED_RANGE_MATCHER = '/^>(=?)\s*' .
self::UNTAGGED_VERSION_MATCHER .
'\s*,\s*<(=?)\s*' .
self::UNTAGGED_VERSION_MATCHER .
'$/';
public const LEFT_OPEN_RANGE_MATCHER = '/^<(=?)\s*' .
self::UNTAGGED_VERSION_MATCHER .
'$/';
public const RIGHT_OPEN_RANGE_MATCHER = '/^>(=?)\s*' .
self::UNTAGGED_VERSION_MATCHER .
'$/';
}