ElementExtractor::extractIds()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ReliqArts\StyleImporter\HTML\Extractor;
6
7
use ReliqArts\StyleImporter\HTML\Extractor;
8
9
final class ElementExtractor implements Extractor
10
{
11
    private const PATTERN_CLASSES = '#\<\w[^<>]*\sclass=[\"\\\']([\w\s-]+)[\"\\\'][\s\>\/]#';
12
    private const PATTERN_IDS = '#\<\w[^<>]*\sid=[\"\\\']([\w-]+)[\"\\\'][\s\>\/]\>?#';
13
    private const PATTERN_TAGS = '#\<([\w-]+)[\s\>]#';
14
15
    /**
16
     * @param string $html
17
     *
18
     * @return string[]
19
     */
20
    public function extractClasses(string $html): array
21
    {
22
        $extractedClasses = $this->extractItemsByPattern($html, self::PATTERN_CLASSES);
23
        $classNames = [];
24
25
        foreach ($extractedClasses as $combinedClass) {
26
            $splitClasses = array_map(
27
                function (string $class): string {
28
                    return sprintf('.%s', $class);
29
                },
30
                preg_split('/\s+/', $combinedClass)
0 ignored issues
show
Bug introduced by
It seems like preg_split('/\s+/', $combinedClass) can also be of type false; however, parameter $arr1 of array_map() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

30
                /** @scrutinizer ignore-type */ preg_split('/\s+/', $combinedClass)
Loading history...
31
            );
32
33
            array_push($classNames, ...$splitClasses);
34
        }
35
36
        return array_unique($classNames);
37
    }
38
39
    /**
40
     * @param string $html
41
     *
42
     * @return string[]
43
     */
44
    public function extractIds(string $html): array
45
    {
46
        $idNames = $this->extractItemsByPattern($html, self::PATTERN_IDS);
47
48
        return array_map(
49
            function (string $id): string {
50
                return sprintf('#%s', $id);
51
            },
52
            array_unique($idNames)
53
        );
54
    }
55
56
    /**
57
     * @param string $html
58
     *
59
     * @return string[]
60
     */
61
    public function extractTags(string $html): array
62
    {
63
        return array_unique($this->extractItemsByPattern($html, self::PATTERN_TAGS));
64
    }
65
66
    /**
67
     * {@inheritdoc}
68
     *
69
     * @param string $html
70
     *
71
     * @return array
72
     */
73
    public function extract(string $html): array
74
    {
75
        return array_merge(
76
            $this->extractTags($html),
77
            $this->extractIds($html),
78
            $this->extractClasses($html)
79
        );
80
    }
81
82
    /**
83
     * @param string $subject
84
     * @param string $pattern
85
     *
86
     * @return array
87
     */
88
    private function extractItemsByPattern(string $subject, string $pattern): array
89
    {
90
        $matchCount = preg_match_all($pattern, $subject, $matches);
91
92
        if (empty($matchCount)) {
93
            return [];
94
        }
95
96
        return $matches[1];
97
    }
98
}
99