RegexTrait.php
2.84 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
declare(strict_types=1);
namespace WP_Rocket\Engine\Optimization;
trait RegexTrait {
/**
* Array of replaced xmp tags
*
* @var array
*/
private $xmp_replace = [];
/**
* Finds nodes matching the pattern in the HTML.
*
* @param string $pattern Pattern to match.
* @param string $html HTML content.
* @param string $modifiers Regex modifiers.
*
* @return array
*/
protected function find( string $pattern, string $html, string $modifiers = 'Umsi' ) {
preg_match_all( '/' . $pattern . '/' . $modifiers, $html, $matches, PREG_SET_ORDER );
if ( empty( $matches ) ) {
return [];
}
return $matches;
}
/**
* Hides unwanted blocks from the HTML to be parsed for optimization
*
* @since 3.1.4
*
* @param string $html HTML content.
* @return string
*/
protected function hide_comments( $html ) {
$replace = preg_replace( '#<!--\s*noptimize\s*-->.*?<!--\s*/\s*noptimize\s*-->#is', '', $html );
if ( null === $replace ) {
return $html;
}
$replace = preg_replace( '/<!--(.*)-->/Uis', '', $replace );
if ( null === $replace ) {
return $html;
}
return $replace;
}
/**
* Hides scripts from the HTML to be parsed when removing CSS from it
*
* @since 3.10.2
*
* @param string $html HTML content.
*
* @return string
*/
protected function hide_scripts( $html ) {
$replace = preg_replace( '#<script[^>]*>.*?<\/script\s*>#mis', '', $html );
if ( null === $replace ) {
return $html;
}
return $replace;
}
/**
* Hides <noscript> blocks from the HTML to be parsed.
*
* @param string $html HTML content.
*
* @return string
*/
protected function hide_noscripts( $html ) {
$replace = preg_replace( '#<noscript[^>]*>.*?<\/noscript\s*>#mis', '', $html );
if ( null === $replace ) {
return $html;
}
return $replace;
}
/**
* Replace <xmp> tags in the HTML with comment
*
* @since 3.12.3
*
* @param string $html HTML content.
* @return string
*/
protected function replace_xmp_tags( $html ) {
$this->xmp_replace = [];
$regex = '#<xmp.*>.*</xmp>#Uis';
$replaced_html = preg_replace_callback( $regex, [ $this, 'replace_xmp' ], $html );
if ( empty( $replaced_html ) ) {
return $html;
}
return $replaced_html;
}
/**
* Replace xmp with comment
*
* @since 3.12.3
*
* @param array $match xmp tag.
* @return string
*/
protected function replace_xmp( $match ) {
$key = sprintf( '<!-- %s -->', uniqid( 'WPR_XMP_' ) );
$this->xmp_replace[ $key ] = $match[0];
return $key;
}
/**
* Restore <xmp> tags
*
* @since 3.12.3
*
* @param string $html HTML content.
* @return string
*/
protected function restore_xmp_tags( $html ) {
if ( empty( $this->xmp_replace ) ) {
return $html;
}
return str_replace( array_keys( $this->xmp_replace ), array_values( $this->xmp_replace ), $html );
}
}