Link   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 29
c 1
b 0
f 0
dl 0
loc 45
rs 10
wmc 11

1 Method

Rating   Name   Duplication   Size   Complexity  
B normalize() 0 43 11
1
<?php
2
/**
3
 * @author: Denis Beliaev
4
 */
5
6
namespace DenisBeliaev\SitemapParser;
7
8
/**
9
 * Class Link
10
 * @package DenisBeliaev\SitemapParser
11
 */
12
class Link
13
{
14
    public static function normalize($link, $base)
15
    {
16
        if (substr($link, 0, 2) == '<a' && substr($link, -4, 4) == '</a>') {
17
            preg_match('~href=[\'"](.*?)[\'"]~i', $link, $matches);
18
            $link = $matches[1] ?? '';
19
        }
20
21
        $link = urldecode($link);
22
        $link = explode('#', $link)[0];
23
24
        if (empty($link)) {
25
            return '';
26
        }
27
28
        if (preg_match('~^mailto:|tel:.*~i', $link)) {
29
            return '';
30
        } elseif (preg_match('~^https?://[^/].*~i', $link)) {
31
            return $link;
32
        }
33
34
        $isProtocolRelative = preg_match('~^//[^/].*~', $link);
35
36
        $isSiteRelative = preg_match('~^/[^/].*~', $link);
37
        $isMainPage = $link == '/';
38
39
        $components = parse_url($base);
40
        if (empty($components['scheme']) || empty($components['host'])) {
41
            throw new \InvalidArgumentException('Wrong base value');
42
        }
43
        $scheme = $components['scheme'];
44
        $host = $components['host'];
45
46
        if ($isMainPage) {
47
            $link = $scheme . '://' . $host;
48
        } elseif ($isProtocolRelative) {
49
            $link = $scheme . ':' . $link;
50
        } elseif ($isSiteRelative) {
51
            $link = $scheme . '://' . $host . $link;
52
        } else {
53
            $link = $base . '/' . $link;
54
        }
55
56
        return $link;
57
    }
58
}