Completed
Push — upstream ( a9ebd9...8f1ff9 )
by Alexandre
07:15
created

htmLawed.php ➔ hl_aux2()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
/*
4
htmLawed 1.2.4, 31 August 2017
5
Copyright Santosh Patnaik
6
Dual licensed with LGPL 3 and GPL 2+
7
A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed
8
9
See htmLawed_README.txt/htm
10
*/
11
12
function htmLawed($t, $C = 1, $S = array()) {
13
    $C = is_array($C) ? $C : array();
14
    if (!empty($C['valid_xhtml'])) {
15
        $C['elements'] = empty($C['elements']) ? '*-acronym-big-center-dir-font-isindex-s-strike-tt' : $C['elements'];
16
        $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2;
17
        $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2;
18
    }
19
// config eles
20
    $e = array('a' => 1, 'abbr' => 1, 'acronym' => 1, 'address' => 1, 'applet' => 1, 'area' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'blockquote' => 1, 'br' => 1, 'button' => 1, 'canvas' => 1, 'caption' => 1, 'center' => 1, 'cite' => 1, 'code' => 1, 'col' => 1, 'colgroup' => 1, 'command' => 1, 'data' => 1, 'datalist' => 1, 'dd' => 1, 'del' => 1, 'details' => 1, 'dfn' => 1, 'dir' => 1, 'div' => 1, 'dl' => 1, 'dt' => 1, 'em' => 1, 'embed' => 1, 'fieldset' => 1, 'figcaption' => 1, 'figure' => 1, 'font' => 1, 'footer' => 1, 'form' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'header' => 1, 'hgroup' => 1, 'hr' => 1, 'i' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'ins' => 1, 'isindex' => 1, 'kbd' => 1, 'keygen' => 1, 'label' => 1, 'legend' => 1, 'li' => 1, 'link' => 1, 'main' => 1, 'map' => 1, 'mark' => 1, 'menu' => 1, 'meta' => 1, 'meter' => 1, 'nav' => 1, 'noscript' => 1, 'object' => 1, 'ol' => 1, 'optgroup' => 1, 'option' => 1, 'output' => 1, 'p' => 1, 'param' => 1, 'pre' => 1, 'progress' => 1, 'q' => 1, 'rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1, 'ruby' => 1, 's' => 1, 'samp' => 1, 'script' => 1, 'section' => 1, 'select' => 1, 'small' => 1, 'source' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'style' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'textarea' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'time' => 1, 'tr' => 1, 'track' => 1, 'tt' => 1, 'u' => 1, 'ul' => 1, 'var' => 1, 'video' => 1, 'wbr' => 1); // 118 incl. deprecated & some Ruby
21
22
    if (!empty($C['safe'])) {
23
        unset($e['applet'], $e['audio'], $e['canvas'], $e['embed'], $e['iframe'], $e['object'], $e['script'], $e['video']);
24
    }
25
    $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*';
26
    if ($x == '-*') {
27
        $e = array();
28
    } elseif (strpos($x, '*') === false) {
29
        $e = array_flip(explode(',', $x));
30
    } else {
31
        if (isset($x[1])) {
32
            preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER);
33
            for ($i = count($m); --$i >= 0;) {
34
                $m[$i] = $m[$i][0];
35
            }
36
            foreach ($m as $v) {
0 ignored issues
show
Bug introduced by
The expression $m of type null|array<integer,array<integer,string>> is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
37
                if ($v[0] == '+') {
38
                    $e[substr($v, 1)] = 1;
39
                }
40
                if ($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'.$v, $m)) {
41
                    unset($e[$v]);
42
                }
43
            }
44
        }
45
    }
46
    $C['elements'] =& $e;
47
// config attrs
48
    $x = !empty($C['deny_attribute']) ? strtolower(str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute'])) : '';
49
    $x = array_flip((isset($x[0]) && $x[0] == '*') ? str_replace('/', 'data-', explode('-', str_replace('data-', '/', $x))) : explode(',', $x.(!empty($C['safe']) ? ',on*' : '')));
50
    $C['deny_attribute'] = $x;
51
// config URLs
52
    $x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet'.(empty($C['safe']) ? ', app, javascript; *: data, javascript, ' : '; *:').'file, http, https';
53
    $C['schemes'] = array();
54
    foreach (explode(';', str_replace(array(' ', "\t", "\r", "\n"), '', $x)) as $v) {
55
        $x = $x2 = null;
56
        list($x, $x2) = explode(':', $v, 2);
57
        if ($x2) {
58
            $C['schemes'][$x] = array_flip(explode(',', $x2));
59
        }
60
    }
61
    if (!isset($C['schemes']['*'])) {
62
        $C['schemes']['*'] = array('file' => 1, 'http' => 1, 'https' => 1);
63
        if (empty($C['safe'])) {
64
            $C['schemes']['*'] += array('data' => 1, 'javascript' => 1);
65
        }
66
    }
67
    if (!empty($C['safe']) && empty($C['schemes']['style'])) {
68
        $C['schemes']['style'] = array('!' => 1);
69
    }
70
    $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0;
71
    if (!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])) {
72
        $C['base_url'] = $C['abs_url'] = 0;
73
    }
74
// config rest
75
    $C['and_mark'] = empty($C['and_mark']) ? 0 : 1;
76
    $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0;
77
    $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0;
78
    $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1;
79
    $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0);
80
    $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char'];
81
    $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0);
82
    $C['css_expression'] = empty($C['css_expression']) ? 0 : 1;
83
    $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1;
84
    $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1;
85
    $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0;
86
    $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0;
87
    $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6;
88
    $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1;
89
    $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1;
90
    $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1;
91
    $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1;
92
    $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body';
93
    $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0;
94
    $C['style_pass'] = empty($C['style_pass']) ? 0 : 1;
95
    $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy'];
96
    $C['unique_ids'] = isset($C['unique_ids']) && (!preg_match('`\W`', $C['unique_ids'])) ? $C['unique_ids'] : 1;
97
    $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0;
98
99
    if (isset($GLOBALS['C'])) {
100
        $reC = $GLOBALS['C'];
101
    }
102
    $GLOBALS['C'] = $C;
103
    $S = is_array($S) ? $S : hl_spec($S);
104
    if (isset($GLOBALS['S'])) {
105
        $reS = $GLOBALS['S'];
106
    }
107
    $GLOBALS['S'] = $S;
108
109
    $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t);
110
    if ($C['clean_ms_char']) {
111
        $x = array("\x7f" => '', "\x80" => '&#8364;', "\x81" => '', "\x83" => '&#402;', "\x85" => '&#8230;', "\x86" => '&#8224;', "\x87" => '&#8225;', "\x88" => '&#710;', "\x89" => '&#8240;', "\x8a" => '&#352;', "\x8b" => '&#8249;', "\x8c" => '&#338;', "\x8d" => '', "\x8e" => '&#381;', "\x8f" => '', "\x90" => '', "\x95" => '&#8226;', "\x96" => '&#8211;', "\x97" => '&#8212;', "\x98" => '&#732;', "\x99" => '&#8482;', "\x9a" => '&#353;', "\x9b" => '&#8250;', "\x9c" => '&#339;', "\x9d" => '', "\x9e" => '&#382;', "\x9f" => '&#376;');
112
        $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82" => '&#8218;', "\x84" => '&#8222;', "\x91" => '&#8216;', "\x92" => '&#8217;', "\x93" => '&#8220;', "\x94" => '&#8221;') : array("\x82" => '\'', "\x84" => '"', "\x91" => '\'', "\x92" => '\'', "\x93" => '"', "\x94" => '"'));
113
        $t = strtr($t, $x);
114
    }
115
    if ($C['cdata'] or $C['comment']) {
116
        $t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);
117
    }
118
    $t = preg_replace_callback('`&amp;([a-zA-Z][a-zA-Z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'hl_ent', str_replace('&', '&amp;', $t));
119
    if ($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])) {
120
        $GLOBALS['hl_Ids'] = array();
121
    }
122
    if ($C['hook']) {
123
        $t = $C['hook']($t, $C, $S);
124
    }
125
    if ($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])) {
126
        $GLOBALS[$C['show_setting']] = array('config' => $C, 'spec' => $S, 'time' => microtime());
127
    }
128
// main
129
    $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t);
130
    $t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t;
131
    $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t;
132
    $t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t;
133
    unset($C, $e);
134
    if (isset($reC)) {
135
        $GLOBALS['C'] = $reC;
136
    }
137
    if (isset($reS)) {
138
        $GLOBALS['S'] = $reS;
139
    }
140
    return $t;
141
}
142
143
function hl_attrval($a, $t, $p) {
144
// check attr val against $S
145
    static $ma = array('accesskey', 'class', 'itemtype', 'rel');
146
    $s = in_array($a, $ma) ? ' ' : ($a == 'srcset' ? ',' : '');
147
    $r = array();
148
    $t = !empty($s) ? explode($s, $t) : array($t);
149
    foreach ($t as $tk => $tv) {
150
        $o = 1;
151
        $tv = trim($tv);
152
        $l = strlen($tv);
153
        foreach ($p as $k => $v) {
154
            if (!$l) {
155
                continue;
156
            }
157
            switch ($k) {
158
                case 'maxlen':
159
                    if ($l > $v) {
160
                        $o = 0;
161
                    }
162
                    break;
163
                case 'minlen':
164
                    if ($l < $v) {
165
                        $o = 0;
166
                    }
167
                    break;
168
                case 'maxval':
169
                    if ((float)($tv) > $v) {
170
                        $o = 0;
171
                    }
172
                    break;
173
                case 'minval':
174
                    if ((float)($tv) < $v) {
175
                        $o = 0;
176
                    }
177
                    break;
178
                case 'match':
179
                    if (!preg_match($v, $tv)) {
180
                        $o = 0;
181
                    }
182
                    break;
183
                case 'nomatch':
184
                    if (preg_match($v, $tv)) {
185
                        $o = 0;
186
                    }
187
                    break;
188 View Code Duplication
                case 'oneof':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
189
                    $m = 0;
190
                    foreach (explode('|', $v) as $n) {
191
                        if ($tv == $n) {
192
                            $m = 1;
193
                            break;
194
                        }
195
                    }
196
                    $o = $m;
197
                    break;
198 View Code Duplication
                case 'noneof':
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
199
                    $m = 1;
200
                    foreach (explode('|', $v) as $n) {
201
                        if ($tv == $n) {
202
                            $m = 0;
203
                            break;
204
                        }
205
                    }
206
                    $o = $m;
207
                    break;
208
                default:
209
                    break;
210
            }
211
            if (!$o) {
212
                break;
213
            }
214
        }
215
        if ($o) {
216
            $r[] = $tv;
217
        }
218
    }
219
    if ($s == ',') {
220
        $s = ', ';
221
    }
222
    $r = implode($s, $r);
223
    return (isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0));
224
}
225
226
function hl_bal($t, $do = 1, $in = 'div') {
227
// balance tags
228
// by content
229
    $cB = array('blockquote' => 1, 'form' => 1, 'map' => 1, 'noscript' => 1); // Block
230
    $cE = array('area' => 1, 'br' => 1, 'col' => 1, 'command' => 1, 'embed' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'isindex' => 1, 'keygen' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'source' => 1, 'track' => 1, 'wbr' => 1); // Empty
231
    $cF = array('a' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'button' => 1, 'canvas' => 1, 'del' => 1, 'details' => 1, 'div' => 1, 'dd' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'header' => 1, 'iframe' => 1, 'ins' => 1, 'li' => 1, 'main' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'object' => 1, 'section' => 1, 'style' => 1, 'td' => 1, 'th' => 1, 'video' => 1); // Flow; later context-wise dynamic move of ins & del to $cI
232
    $cI = array('abbr' => 1, 'acronym' => 1, 'address' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'caption' => 1, 'cite' => 1, 'code' => 1, 'data' => 1, 'datalist' => 1, 'dfn' => 1, 'dt' => 1, 'em' => 1, 'figcaption' => 1, 'font' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hgroup' => 1, 'i' => 1, 'kbd' => 1, 'label' => 1, 'legend' => 1, 'mark' => 1, 'meter' => 1, 'output' => 1, 'p' => 1, 'pre' => 1, 'progress' => 1, 'q' => 1, 'rb' => 1, 'rt' => 1, 's' => 1, 'samp' => 1, 'small' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'time' => 1, 'tt' => 1, 'u' => 1, 'var' => 1); // Inline
233
    $cN = array('a' => array('a' => 1, 'address' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'keygen' => 1, 'label' => 1, 'select' => 1, 'textarea' => 1), 'address' => array('address' => 1, 'article' => 1, 'aside' => 1, 'header' => 1, 'keygen' => 1, 'footer' => 1, 'nav' => 1, 'section' => 1), 'button' => array('a' => 1, 'address' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'fieldset' => 1, 'form' => 1, 'iframe' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'select' => 1, 'textarea' => 1), 'fieldset' => array('fieldset' => 1), 'footer' => array('header' => 1, 'footer' => 1), 'form' => array('form' => 1), 'header' => array('header' => 1, 'footer' => 1), 'label' => array('label' => 1), 'main' => array('main' => 1), 'meter' => array('meter' => 1), 'noscript' => array('script' => 1), 'pre' => array('big' => 1, 'font' => 1, 'img' => 1, 'object' => 1, 'script' => 1, 'small' => 1, 'sub' => 1, 'sup' => 1), 'progress' => array('progress' => 1), 'rb' => array('ruby' => 1), 'rt' => array('ruby' => 1), 'time' => array('time' => 1),); // Illegal
234
    $cN2 = array_keys($cN);
235
    $cS = array('colgroup' => array('col' => 1), 'datalist' => array('option' => 1), 'dir' => array('li' => 1), 'dl' => array('dd' => 1, 'dt' => 1), 'hgroup' => array('h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1), 'menu' => array('li' => 1), 'ol' => array('li' => 1), 'optgroup' => array('option' => 1), 'option' => array('#pcdata' => 1), 'rbc' => array('rb' => 1), 'rp' => array('#pcdata' => 1), 'rtc' => array('rt' => 1), 'ruby' => array('rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1), 'select' => array('optgroup' => 1, 'option' => 1), 'script' => array('#pcdata' => 1), 'table' => array('caption' => 1, 'col' => 1, 'colgroup' => 1, 'tfoot' => 1, 'tbody' => 1, 'tr' => 1, 'thead' => 1), 'tbody' => array('tr' => 1), 'tfoot' => array('tr' => 1), 'textarea' => array('#pcdata' => 1), 'thead' => array('tr' => 1), 'tr' => array('td' => 1, 'th' => 1), 'ul' => array('li' => 1)); // Specific - immediate parent-child
236
    if ($GLOBALS['C']['direct_list_nest']) {
237
        $cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu' => 1, 'ol' => 1, 'ul' => 1);
238
    }
239
    $cO = array('address' => array('p' => 1), 'applet' => array('param' => 1), 'audio' => array('source' => 1, 'track' => 1), 'blockquote' => array('script' => 1), 'details' => array('summary' => 1), 'fieldset' => array('legend' => 1, '#pcdata' => 1), 'figure' => array('figcaption' => 1), 'form' => array('script' => 1), 'map' => array('area' => 1), 'object' => array('param' => 1, 'embed' => 1), 'video' => array('source' => 1, 'track' => 1)); // Other
240
    $cT = array('colgroup' => 1, 'dd' => 1, 'dt' => 1, 'li' => 1, 'option' => 1, 'p' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1); // Omitable closing
241
// block/inline type; a/ins/del both type; #pcdata: text
242
    $eB = array('a' => 1, 'address' => 1, 'article' => 1, 'aside' => 1, 'blockquote' => 1, 'center' => 1, 'del' => 1, 'details' => 1, 'dir' => 1, 'dl' => 1, 'div' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'form' => 1, 'ins' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'header' => 1, 'hr' => 1, 'isindex' => 1, 'main' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'ol' => 1, 'p' => 1, 'pre' => 1, 'section' => 1, 'style' => 1, 'table' => 1, 'ul' => 1);
243
    $eI = array('#pcdata' => 1, 'a' => 1, 'abbr' => 1, 'acronym' => 1, 'applet' => 1, 'audio' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'br' => 1, 'button' => 1, 'canvas' => 1, 'cite' => 1, 'code' => 1, 'command' => 1, 'data' => 1, 'datalist' => 1, 'del' => 1, 'dfn' => 1, 'em' => 1, 'embed' => 1, 'figcaption' => 1, 'font' => 1, 'i' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'ins' => 1, 'kbd' => 1, 'label' => 1, 'link' => 1, 'map' => 1, 'mark' => 1, 'meta' => 1, 'meter' => 1, 'object' => 1, 'output' => 1, 'progress' => 1, 'q' => 1, 'ruby' => 1, 's' => 1, 'samp' => 1, 'select' => 1, 'script' => 1, 'small' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'textarea' => 1, 'time' => 1, 'tt' => 1, 'u' => 1, 'var' => 1, 'video' => 1, 'wbr' => 1);
244
    $eN = array('a' => 1, 'address' => 1, 'article' => 1, 'aside' => 1, 'big' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'fieldset' => 1, 'font' => 1, 'footer' => 1, 'form' => 1, 'header' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'meter' => 1, 'nav' => 1, 'object' => 1, 'progress' => 1, 'ruby' => 1, 'script' => 1, 'select' => 1, 'small' => 1, 'sub' => 1, 'sup' => 1, 'textarea' => 1, 'time' => 1); // Exclude from specific ele; $cN values
245
    $eO = array('area' => 1, 'caption' => 1, 'col' => 1, 'colgroup' => 1, 'command' => 1, 'dd' => 1, 'dt' => 1, 'hgroup' => 1, 'keygen' => 1, 'legend' => 1, 'li' => 1, 'optgroup' => 1, 'option' => 1, 'param' => 1, 'rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1, 'script' => 1, 'source' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'thead' => 1, 'th' => 1, 'tr' => 1, 'track' => 1); // Missing in $eB & $eI
246
    $eF = $eB + $eI;
247
248
// $in sets allowed child
249
    $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div';
250
    if (isset($cE[$in])) {
251
        return (!$do ? '' : str_replace(array('<', '>'), array('&lt;', '&gt;'), $t));
252
    }
253
    if (isset($cS[$in])) {
254
        $inOk = $cS[$in];
255
    } elseif (isset($cI[$in])) {
256
        $inOk = $eI;
257
        $cI['del'] = 1;
258
        $cI['ins'] = 1;
259
    } elseif (isset($cF[$in])) {
260
        $inOk = $eF;
261
        unset($cI['del'], $cI['ins']);
262
    } elseif (isset($cB[$in])) {
263
        $inOk = $eB;
264
        unset($cI['del'], $cI['ins']);
265
    }
266
    if (isset($cO[$in])) {
267
        $inOk = $inOk + $cO[$in];
0 ignored issues
show
Bug introduced by
The variable $inOk does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
268
    }
269
    if (isset($cN[$in])) {
270
        $inOk = array_diff_assoc($inOk, $cN[$in]);
271
    }
272
273
    $t = explode('<', $t);
274
    $ok = $q = array(); // $q seq list of open non-empty ele
275
    ob_start();
276
277
    for ($i = -1, $ci = count($t); ++$i < $ci;) {
278
        // allowed $ok in parent $p
279 View Code Duplication
        if ($ql = count($q)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
280
            $p = array_pop($q);
281
            $q[] = $p;
282
            if (isset($cS[$p])) {
283
                $ok = $cS[$p];
284
            } elseif (isset($cI[$p])) {
285
                $ok = $eI;
286
                $cI['del'] = 1;
287
                $cI['ins'] = 1;
288
            } elseif (isset($cF[$p])) {
289
                $ok = $eF;
290
                unset($cI['del'], $cI['ins']);
291
            } elseif (isset($cB[$p])) {
292
                $ok = $eB;
293
                unset($cI['del'], $cI['ins']);
294
            }
295
            if (isset($cO[$p])) {
296
                $ok = $ok + $cO[$p];
297
            }
298
            if (isset($cN[$p])) {
299
                $ok = array_diff_assoc($ok, $cN[$p]);
300
            }
301
        } else {
302
            $ok = $inOk;
303
            unset($cI['del'], $cI['ins']);
304
        }
305
        // bad tags, & ele content
306 View Code Duplication
        if (isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
307
            echo '&lt;', $s, $e, $a, '&gt;';
0 ignored issues
show
Bug introduced by
The variable $s does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
Bug introduced by
The variable $a does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
308
        }
309 View Code Duplication
        if (isset($x[0])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
310
            if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
311
                echo '<div>', $x, '</div>';
312
            } elseif ($do < 3 or isset($ok['#pcdata'])) {
313
                echo $x;
314
            } elseif (strpos($x, "\x02\x04")) {
315
                foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
316
                    echo(substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
317
                }
318
            } elseif ($do > 4) {
319
                echo preg_replace('`\S`', '', $x);
320
            }
321
        }
322
        // get markup
323
        if (!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)) {
324
            $x = $t[$i];
325
            continue;
326
        }
327
        $s = null;
328
        $e = null;
329
        $a = null;
330
        $x = null;
331
        list($all, $s, $e, $a, $x) = $r;
0 ignored issues
show
Unused Code introduced by
The assignment to $all is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
332
        // close tag
333
        if ($s) {
334
            if (isset($cE[$e]) or !in_array($e, $q)) {
335
                continue;
336
            } // Empty/unopen
337
            if ($p == $e) {
0 ignored issues
show
Bug introduced by
The variable $p does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
338
                array_pop($q);
339
                echo '</', $e, '>';
340
                unset($e);
341
                continue;
342
            } // Last open
343
            $add = ''; // Nesting - close open tags that need to be
344
            for ($j = -1, $cj = count($q); ++$j < $cj;) {
345
                if (($d = array_pop($q)) == $e) {
346
                    break;
347
                } else {
348
                    $add .= "</{$d}>";
349
                }
350
            }
351
            echo $add, '</', $e, '>';
352
            unset($e);
353
            continue;
354
        }
355
        // open tag
356
        // $cB ele needs $eB ele as child
357
        if (isset($cB[$e]) && strlen(trim($x))) {
358
            $t[$i] = "{$e}{$a}>";
359
            array_splice($t, $i + 1, 0, 'div>'.$x);
360
            unset($e, $x);
361
            ++$ci;
362
            --$i;
363
            continue;
364
        }
365
        if ((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])) {
366
            array_splice($t, $i, 0, 'div>');
367
            unset($e, $x);
368
            ++$ci;
369
            --$i;
370
            continue;
371
        }
372
        // if no open ele, $in = parent; mostly immediate parent-child relation should hold
373
        if (!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)) {
374
            if (!isset($ok[$e])) {
375
                if ($ql && isset($cT[$p])) {
376
                    echo '</', array_pop($q), '>';
377
                    unset($e, $x);
378
                    --$i;
379
                }
380
                continue;
381
            }
382
            if (!isset($cE[$e])) {
383
                $q[] = $e;
384
            }
385
            echo '<', $e, $a, '>';
386
            unset($e);
387
            continue;
388
        }
389
        // specific parent-child
390
        if (isset($cS[$p][$e])) {
391
            if (!isset($cE[$e])) {
392
                $q[] = $e;
393
            }
394
            echo '<', $e, $a, '>';
395
            unset($e);
396
            continue;
397
        }
398
        // nesting
399
        $add = '';
400
        $q2 = array();
401
        for ($k = -1, $kc = count($q); ++$k < $kc;) {
402
            $d = $q[$k];
403
            $ok2 = array();
0 ignored issues
show
Unused Code introduced by
$ok2 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
404
            if (isset($cS[$d])) {
405
                $q2[] = $d;
406
                continue;
407
            }
408
            $ok2 = isset($cI[$d]) ? $eI : $eF;
409
            if (isset($cO[$d])) {
410
                $ok2 = $ok2 + $cO[$d];
411
            }
412
            if (isset($cN[$d])) {
413
                $ok2 = array_diff_assoc($ok2, $cN[$d]);
414
            }
415
            if (!isset($ok2[$e])) {
416
                if (!$k && !isset($inOk[$e])) {
417
                    continue 2;
418
                }
419
                $add = "</{$d}>";
420
                for (; ++$k < $kc;) {
421
                    $add = "</{$q[$k]}>{$add}";
422
                }
423
                break;
424
            } else {
425
                $q2[] = $d;
426
            }
427
        }
428
        $q = $q2;
429
        if (!isset($cE[$e])) {
430
            $q[] = $e;
431
        }
432
        echo $add, '<', $e, $a, '>';
433
        unset($e);
434
        continue;
435
    }
436
437
// end
438 View Code Duplication
    if ($ql = count($q)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
439
        $p = array_pop($q);
440
        $q[] = $p;
441
        if (isset($cS[$p])) {
442
            $ok = $cS[$p];
443
        } elseif (isset($cI[$p])) {
444
            $ok = $eI;
445
            $cI['del'] = 1;
446
            $cI['ins'] = 1;
447
        } elseif (isset($cF[$p])) {
448
            $ok = $eF;
449
            unset($cI['del'], $cI['ins']);
450
        } elseif (isset($cB[$p])) {
451
            $ok = $eB;
452
            unset($cI['del'], $cI['ins']);
453
        }
454
        if (isset($cO[$p])) {
455
            $ok = $ok + $cO[$p];
456
        }
457
        if (isset($cN[$p])) {
458
            $ok = array_diff_assoc($ok, $cN[$p]);
459
        }
460
    } else {
461
        $ok = $inOk;
462
        unset($cI['del'], $cI['ins']);
463
    }
464 View Code Duplication
    if (isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
465
        echo '&lt;', $s, $e, $a, '&gt;';
466
    }
467 View Code Duplication
    if (isset($x[0])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
468
        if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
469
            echo '<div>', $x, '</div>';
470
        } elseif ($do < 3 or isset($ok['#pcdata'])) {
471
            echo $x;
472
        } elseif (strpos($x, "\x02\x04")) {
473
            foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
474
                echo(substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
475
            }
476
        } elseif ($do > 4) {
477
            echo preg_replace('`\S`', '', $x);
478
        }
479
    }
480
    while (!empty($q) && ($e = array_pop($q))) {
481
        echo '</', $e, '>';
482
    }
483
    $o = ob_get_contents();
484
    ob_end_clean();
485
    return $o;
486
}
487
488
function hl_cmtcd($t) {
489
// comment/CDATA sec handler
490
    $t = $t[0];
491
    global $C;
492
    if (!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])) {
493
        return $t;
494
    }
495
    if ($v == 1) {
496
        return '';
497
    }
498
    if ($n == 'comment' && $v < 4) {
499
        if (substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' ') {
500
            $t .= ' ';
501
        }
502
    } else {
503
        $t = substr($t, 1, -1);
504
    }
505
    $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $t) : $t;
506
    return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01"));
507
}
508
509
function hl_ent($t) {
510
// entitity handler
511
    global $C;
512
    $t = $t[1];
513
    static $U = array('quot' => 1, 'amp' => 1, 'lt' => 1, 'gt' => 1);
514
    static $N = array('fnof' => '402', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'bull' => '8226', 'hellip' => '8230', 'prime' => '8242', 'Prime' => '8243', 'oline' => '8254', 'frasl' => '8260', 'weierp' => '8472', 'image' => '8465', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830', 'apos' => '39', 'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', 'circ' => '710', 'tilde' => '732', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'permil' => '8240', 'lsaquo' => '8249', 'rsaquo' => '8250', 'euro' => '8364', 'nbsp' => '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', 'thorn' => '254', 'yuml' => '255');
515
    if ($t[0] != '#') {
516
        return ($C['and_mark'] ? "\x06" : '&').(isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'.($C['hexdec_entity'] > 1 ? 'x'.dechex($N[$t]) : $N[$t]) : $t) : 'amp;'.$t)).';';
517
    }
518
    if (($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))) {
519
        return ($C['and_mark'] ? "\x06" : '&')."amp;#{$t};";
520
    }
521
    return ($C['and_mark'] ? "\x06" : '&').'#'.(((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'.dechex($n)).';';
522
}
523
524
function hl_prot($p, $c = null) {
525
// check URL scheme
526
    global $C;
527
    $b = $a = '';
528
    if ($c == null) {
529
        $c = 'style';
530
        $b = $p[1];
531
        $a = $p[3];
532
        $p = trim($p[2]);
533
    }
534
    $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*'];
535
    static $d = 'denied:';
536
    if (isset($c['!']) && substr($p, 0, 7) != $d) {
537
        $p = "$d$p";
538
    }
539
    if (isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)) {
540
        return "{$b}{$p}{$a}";
541
    } // All ok, frag, query, param
542
    if (preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])) { // Denied prot
543
        return "{$b}{$d}{$p}{$a}";
544
    }
545
    if ($C['abs_url']) {
546
        if ($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0) { // Make url rel
547
            $p = substr($p, strlen($C['base_url']));
548
        } elseif (empty($m[1])) { // Make URL abs
549
            if (substr($p, 0, 2) == '//') {
550
                $p = substr($C['base_url'], 0, strpos($C['base_url'], ':') + 1).$p;
551
            } elseif ($p[0] == '/') {
552
                $p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']).$p;
553
            } elseif (strcspn($p, './')) {
554
                $p = $C['base_url'].$p;
555
            } else {
556
                preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m);
557
                $p = preg_replace('`(?<=/)\./`', '', $m[2].$p);
558
                while (preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)) {
559
                    $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p);
560
                }
561
                $p = $m[1].$p;
562
            }
563
        }
564
    }
565
    return "{$b}{$p}{$a}";
566
}
567
568
function hl_regex($p) {
569
// check regex
570
    if (empty($p)) {
571
        return 0;
572
    }
573
    if ($v = function_exists('error_clear_last') && function_exists('error_get_last')) {
0 ignored issues
show
Comprehensibility introduced by
Consider adding parentheses for clarity. Current Interpretation: $v = (function_exists('e...ists('error_get_last')), Probably Intended Meaning: ($v = function_exists('e...xists('error_get_last')
Loading history...
574
        error_clear_last();
575 View Code Duplication
    } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
576
        if ($t = ini_get('track_errors')) {
577
            $o = isset($php_errormsg) ? $php_errormsg : null;
578
        } else {
579
            ini_set('track_errors', 1);
580
        }
581
        unset($php_errormsg);
582
    }
583
    if (($d = ini_get('display_errors'))) {
584
        ini_set('display_errors', 0);
585
    }
586
    preg_match($p, '');
587
    if ($v) {
588
        $r = error_get_last() == null ? 1 : 0;
589 View Code Duplication
    } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
590
        $r = isset($php_errormsg) ? 0 : 1;
591
        if ($t) {
0 ignored issues
show
Bug introduced by
The variable $t does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
592
            $php_errormsg = isset($o) ? $o : null;
0 ignored issues
show
Unused Code introduced by
$php_errormsg is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
593
        } else {
594
            ini_set('track_errors', 0);
595
        }
596
    }
597
    if ($d) {
598
        ini_set('display_errors', 1);
599
    }
600
    return $r;
601
}
602
603
function hl_spec($t) {
604
// final $spec
605
    $s = array();
606
    function hl_aux1($m) {
607
        return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1);
608
    }
609
610
    $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t)));
611
    for ($i = count(($t = explode(';', $t))); --$i >= 0;) {
612
        $w = $t[$i];
613
        if (empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e + 1)))) {
614
            continue;
615
        }
616
        $y = $n = array();
617
        foreach (explode(',', $a) as $v) {
618
            if (!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)) {
619
                continue;
620
            }
621
            if (($x = strtolower($m[1])) == '-*') {
622
                $n['*'] = 1;
623
                continue;
624
            }
625
            if ($x[0] == '-') {
626
                $n[substr($x, 1)] = 1;
627
                continue;
628
            }
629
            if (!isset($m[2])) {
630
                $y[$x] = 1;
631
                continue;
632
            }
633
            foreach (explode('/', $m[2]) as $m) {
634
                if (empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5) {
635
                    $y[$x] = 1;
636
                    continue;
637
                }
638
                $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p + 1));
639
            }
640 View Code Duplication
            if (isset($y[$x]['match']) && !hl_regex($y[$x]['match'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
641
                unset($y[$x]['match']);
642
            }
643 View Code Duplication
            if (isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
644
                unset($y[$x]['nomatch']);
645
            }
646
        }
647
        if (!count($y) && !count($n)) {
648
            continue;
649
        }
650
        foreach (explode(',', substr($w, 0, $e)) as $v) {
651
            if (!strlen(($v = strtolower($v)))) {
652
                continue;
653
            }
654
            if (count($y)) {
655
                if (!isset($s[$v])) {
656
                    $s[$v] = $y;
657
                } else {
658
                    $s[$v] = array_merge($s[$v], $y);
659
                }
660
            }
661
            if (count($n)) {
662
                if (!isset($s[$v]['n'])) {
663
                    $s[$v]['n'] = $n;
664
                } else {
665
                    $s[$v]['n'] = array_merge($s[$v]['n'], $n);
666
                }
667
            }
668
        }
669
    }
670
    return $s;
671
}
672
673
function hl_tag($t) {
674
// tag/attribute handler
675
    global $C;
676
    $t = $t[0];
677
// invalid < >
678
    if ($t == '< ') {
679
        return '&lt; ';
680
    }
681
    if ($t == '>') {
682
        return '&gt;';
683
    }
684
    if (!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)) {
685
        return str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
686
    } elseif (!isset($C['elements'][($e = strtolower($m[2]))])) {
687
        return (($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
688
    }
689
// attr string
690
    $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3]));
691
// tag transform
692
    static $eD = array('acronym' => 1, 'applet' => 1, 'big' => 1, 'center' => 1, 'dir' => 1, 'font' => 1, 'isindex' => 1, 's' => 1, 'strike' => 1, 'tt' => 1); // Deprecated
693
    if ($C['make_tag_strict'] && isset($eD[$e])) {
694
        $trt = hl_tag2($e, $a, $C['make_tag_strict']);
695
        if (!$e) {
696
            return (($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
697
        }
698
    }
699
// close tag
700
    static $eE = array('area' => 1, 'br' => 1, 'col' => 1, 'command' => 1, 'embed' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'isindex' => 1, 'keygen' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'source' => 1, 'track' => 1, 'wbr' => 1); // Empty ele
701
    if (!empty($m[1])) {
702
        return (!isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad']) % 2 ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : ''));
703
    }
704
705
// open tag & attr
706
    static $aN = array('abbr' => array('td' => 1, 'th' => 1), 'accept' => array('form' => 1, 'input' => 1), 'accept-charset' => array('form' => 1), 'action' => array('form' => 1), 'align' => array('applet' => 1, 'caption' => 1, 'col' => 1, 'colgroup' => 1, 'div' => 1, 'embed' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'object' => 1, 'p' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'allowfullscreen' => array('iframe' => 1), 'alt' => array('applet' => 1, 'area' => 1, 'img' => 1, 'input' => 1), 'archive' => array('applet' => 1, 'object' => 1), 'async' => array('script' => 1), 'autocomplete' => array('form' => 1, 'input' => 1), 'autofocus' => array('button' => 1, 'input' => 1, 'keygen' => 1, 'select' => 1, 'textarea' => 1), 'autoplay' => array('audio' => 1, 'video' => 1), 'axis' => array('td' => 1, 'th' => 1), 'bgcolor' => array('embed' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1), 'border' => array('img' => 1, 'object' => 1, 'table' => 1), 'bordercolor' => array('table' => 1, 'td' => 1, 'tr' => 1), 'cellpadding' => array('table' => 1), 'cellspacing' => array('table' => 1), 'challenge' => array('keygen' => 1), 'char' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'charoff' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'charset' => array('a' => 1, 'script' => 1), 'checked' => array('command' => 1, 'input' => 1), 'cite' => array('blockquote' => 1, 'del' => 1, 'ins' => 1, 'q' => 1), 'classid' => array('object' => 1), 'clear' => array('br' => 1), 'code' => array('applet' => 1), 'codebase' => array('applet' => 1, 'object' => 1), 'codetype' => array('object' => 1), 'color' => array('font' => 1), 'cols' => array('textarea' => 1), 'colspan' => array('td' => 1, 'th' => 1), 'compact' => array('dir' => 1, 'dl' => 1, 'menu' => 1, 'ol' => 1, 'ul' => 1), 'content' => array('meta' => 1), 'controls' => array('audio' => 1, 'video' => 1), 'coords' => array('a' => 1, 'area' => 1), 'crossorigin' => array('img' => 1), 'data' => array('object' => 1), 'datetime' => array('del' => 1, 'ins' => 1, 'time' => 1), 'declare' => array('object' => 1), 'default' => array('track' => 1), 'defer' => array('script' => 1), 'dirname' => array('input' => 1, 'textarea' => 1), 'disabled' => array('button' => 1, 'command' => 1, 'fieldset' => 1, 'input' => 1, 'keygen' => 1, 'optgroup' => 1, 'option' => 1, 'select' => 1, 'textarea' => 1), 'download' => array('a' => 1), 'enctype' => array('form' => 1), 'face' => array('font' => 1), 'flashvars' => array('embed' => 1), 'for' => array('label' => 1, 'output' => 1), 'form' => array('button' => 1, 'fieldset' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'object' => 1, 'output' => 1, 'select' => 1, 'textarea' => 1), 'formaction' => array('button' => 1, 'input' => 1), 'formenctype' => array('button' => 1, 'input' => 1), 'formmethod' => array('button' => 1, 'input' => 1), 'formnovalidate' => array('button' => 1, 'input' => 1), 'formtarget' => array('button' => 1, 'input' => 1), 'frame' => array('table' => 1), 'frameborder' => array('iframe' => 1), 'headers' => array('td' => 1, 'th' => 1), 'height' => array('applet' => 1, 'canvas' => 1, 'embed' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'td' => 1, 'th' => 1, 'video' => 1), 'high' => array('meter' => 1), 'href' => array('a' => 1, 'area' => 1, 'link' => 1), 'hreflang' => array('a' => 1, 'area' => 1, 'link' => 1), 'hspace' => array('applet' => 1, 'embed' => 1, 'img' => 1, 'object' => 1), 'icon' => array('command' => 1), 'ismap' => array('img' => 1, 'input' => 1), 'keyparams' => array('keygen' => 1), 'keytype' => array('keygen' => 1), 'kind' => array('track' => 1), 'label' => array('command' => 1, 'menu' => 1, 'option' => 1, 'optgroup' => 1, 'track' => 1), 'language' => array('script' => 1), 'list' => array('input' => 1), 'longdesc' => array('img' => 1, 'iframe' => 1), 'loop' => array('audio' => 1, 'video' => 1), 'low' => array('meter' => 1), 'marginheight' => array('iframe' => 1), 'marginwidth' => array('iframe' => 1), 'max' => array('input' => 1, 'meter' => 1, 'progress' => 1), 'maxlength' => array('input' => 1, 'textarea' => 1), 'media' => array('a' => 1, 'area' => 1, 'link' => 1, 'source' => 1, 'style' => 1), 'mediagroup' => array('audio' => 1, 'video' => 1), 'method' => array('form' => 1), 'min' => array('input' => 1, 'meter' => 1), 'model' => array('embed' => 1), 'multiple' => array('input' => 1, 'select' => 1), 'muted' => array('audio' => 1, 'video' => 1), 'name' => array('a' => 1, 'applet' => 1, 'button' => 1, 'embed' => 1, 'fieldset' => 1, 'form' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'keygen' => 1, 'map' => 1, 'object' => 1, 'output' => 1, 'param' => 1, 'select' => 1, 'textarea' => 1), 'nohref' => array('area' => 1), 'noshade' => array('hr' => 1), 'novalidate' => array('form' => 1), 'nowrap' => array('td' => 1, 'th' => 1), 'object' => array('applet' => 1), 'open' => array('details' => 1), 'optimum' => array('meter' => 1), 'pattern' => array('input' => 1), 'ping' => array('a' => 1, 'area' => 1), 'placeholder' => array('input' => 1, 'textarea' => 1), 'pluginspage' => array('embed' => 1), 'pluginurl' => array('embed' => 1), 'poster' => array('video' => 1), 'pqg' => array('keygen' => 1), 'preload' => array('audio' => 1, 'video' => 1), 'prompt' => array('isindex' => 1), 'pubdate' => array('time' => 1), 'radiogroup' => array('command' => 1), 'readonly' => array('input' => 1, 'textarea' => 1), 'rel' => array('a' => 1, 'area' => 1, 'link' => 1), 'required' => array('input' => 1, 'select' => 1, 'textarea' => 1), 'rev' => array('a' => 1), 'reversed' => array('ol' => 1), 'rows' => array('textarea' => 1), 'rowspan' => array('td' => 1, 'th' => 1), 'rules' => array('table' => 1), 'sandbox' => array('iframe' => 1), 'scope' => array('td' => 1, 'th' => 1), 'scoped' => array('style' => 1), 'scrolling' => array('iframe' => 1), 'seamless' => array('iframe' => 1), 'selected' => array('option' => 1), 'shape' => array('a' => 1, 'area' => 1), 'size' => array('font' => 1, 'hr' => 1, 'input' => 1, 'select' => 1), 'sizes' => array('link' => 1), 'span' => array('col' => 1, 'colgroup' => 1), 'src' => array('audio' => 1, 'embed' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'script' => 1, 'source' => 1, 'track' => 1, 'video' => 1), 'srcdoc' => array('iframe' => 1), 'srclang' => array('track' => 1), 'srcset' => array('img' => 1), 'standby' => array('object' => 1), 'start' => array('ol' => 1), 'step' => array('input' => 1), 'summary' => array('table' => 1), 'target' => array('a' => 1, 'area' => 1, 'form' => 1), 'type' => array('a' => 1, 'area' => 1, 'button' => 1, 'command' => 1, 'embed' => 1, 'input' => 1, 'li' => 1, 'link' => 1, 'menu' => 1, 'object' => 1, 'ol' => 1, 'param' => 1, 'script' => 1, 'source' => 1, 'style' => 1, 'ul' => 1), 'typemustmatch' => array('object' => 1), 'usemap' => array('img' => 1, 'input' => 1, 'object' => 1), 'valign' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'value' => array('button' => 1, 'data' => 1, 'input' => 1, 'li' => 1, 'meter' => 1, 'option' => 1, 'param' => 1, 'progress' => 1), 'valuetype' => array('param' => 1), 'vspace' => array('applet' => 1, 'embed' => 1, 'img' => 1, 'object' => 1), 'width' => array('applet' => 1, 'canvas' => 1, 'col' => 1, 'colgroup' => 1, 'embed' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'pre' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'video' => 1), 'wmode' => array('embed' => 1), 'wrap' => array('textarea' => 1)); // Ele-specific
707
    static $aNA = array('aria-activedescendant' => 1, 'aria-atomic' => 1, 'aria-autocomplete' => 1, 'aria-busy' => 1, 'aria-checked' => 1, 'aria-controls' => 1, 'aria-describedby' => 1, 'aria-disabled' => 1, 'aria-dropeffect' => 1, 'aria-expanded' => 1, 'aria-flowto' => 1, 'aria-grabbed' => 1, 'aria-haspopup' => 1, 'aria-hidden' => 1, 'aria-invalid' => 1, 'aria-label' => 1, 'aria-labelledby' => 1, 'aria-level' => 1, 'aria-live' => 1, 'aria-multiline' => 1, 'aria-multiselectable' => 1, 'aria-orientation' => 1, 'aria-owns' => 1, 'aria-posinset' => 1, 'aria-pressed' => 1, 'aria-readonly' => 1, 'aria-relevant' => 1, 'aria-required' => 1, 'aria-selected' => 1, 'aria-setsize' => 1, 'aria-sort' => 1, 'aria-valuemax' => 1, 'aria-valuemin' => 1, 'aria-valuenow' => 1, 'aria-valuetext' => 1); // ARIA
708
    static $aNE = array('allowfullscreen' => 1, 'checkbox' => 1, 'checked' => 1, 'command' => 1, 'compact' => 1, 'declare' => 1, 'defer' => 1, 'default' => 1, 'disabled' => 1, 'hidden' => 1, 'inert' => 1, 'ismap' => 1, 'itemscope' => 1, 'multiple' => 1, 'nohref' => 1, 'noresize' => 1, 'noshade' => 1, 'nowrap' => 1, 'open' => 1, 'radio' => 1, 'readonly' => 1, 'required' => 1, 'reversed' => 1, 'selected' => 1); // Empty
709
    static $aNO = array('onabort' => 1, 'onblur' => 1, 'oncanplay' => 1, 'oncanplaythrough' => 1, 'onchange' => 1, 'onclick' => 1, 'oncontextmenu' => 1, 'oncopy' => 1, 'oncuechange' => 1, 'oncut' => 1, 'ondblclick' => 1, 'ondrag' => 1, 'ondragend' => 1, 'ondragenter' => 1, 'ondragleave' => 1, 'ondragover' => 1, 'ondragstart' => 1, 'ondrop' => 1, 'ondurationchange' => 1, 'onemptied' => 1, 'onended' => 1, 'onerror' => 1, 'onfocus' => 1, 'onformchange' => 1, 'onforminput' => 1, 'oninput' => 1, 'oninvalid' => 1, 'onkeydown' => 1, 'onkeypress' => 1, 'onkeyup' => 1, 'onload' => 1, 'onloadeddata' => 1, 'onloadedmetadata' => 1, 'onloadstart' => 1, 'onlostpointercapture' => 1, 'onmousedown' => 1, 'onmousemove' => 1, 'onmouseout' => 1, 'onmouseover' => 1, 'onmouseup' => 1, 'onmousewheel' => 1, 'onpaste' => 1, 'onpause' => 1, 'onplay' => 1, 'onplaying' => 1, 'onpointercancel' => 1, 'ongotpointercapture' => 1, 'onpointerdown' => 1, 'onpointerenter' => 1, 'onpointerleave' => 1, 'onpointermove' => 1, 'onpointerout' => 1, 'onpointerover' => 1, 'onpointerup' => 1, 'onprogress' => 1, 'onratechange' => 1, 'onreadystatechange' => 1, 'onreset' => 1, 'onsearch' => 1, 'onscroll' => 1, 'onseeked' => 1, 'onseeking' => 1, 'onselect' => 1, 'onshow' => 1, 'onstalled' => 1, 'onsubmit' => 1, 'onsuspend' => 1, 'ontimeupdate' => 1, 'ontoggle' => 1, 'ontouchcancel' => 1, 'ontouchend' => 1, 'ontouchmove' => 1, 'ontouchstart' => 1, 'onvolumechange' => 1, 'onwaiting' => 1, 'onwheel' => 1); // Event
710
    static $aNP = array('action' => 1, 'cite' => 1, 'classid' => 1, 'codebase' => 1, 'data' => 1, 'href' => 1, 'itemtype' => 1, 'longdesc' => 1, 'model' => 1, 'pluginspage' => 1, 'pluginurl' => 1, 'src' => 1, 'srcset' => 1, 'usemap' => 1); // Need scheme check; excludes style, on*
711
    static $aNU = array('accesskey' => 1, 'class' => 1, 'contenteditable' => 1, 'contextmenu' => 1, 'dir' => 1, 'draggable' => 1, 'dropzone' => 1, 'hidden' => 1, 'id' => 1, 'inert' => 1, 'itemid' => 1, 'itemprop' => 1, 'itemref' => 1, 'itemscope' => 1, 'itemtype' => 1, 'lang' => 1, 'role' => 1, 'spellcheck' => 1, 'style' => 1, 'tabindex' => 1, 'title' => 1, 'translate' => 1, 'xmlns' => 1, 'xml:base' => 1, 'xml:lang' => 1, 'xml:space' => 1); // Univ; excludes on*, aria*
712
713
    if ($C['lc_std_val']) {
714
        // predef attr vals for $eAL & $aNE ele
715
        static $aNL = array('all' => 1, 'auto' => 1, 'baseline' => 1, 'bottom' => 1, 'button' => 1, 'captions' => 1, 'center' => 1, 'chapters' => 1, 'char' => 1, 'checkbox' => 1, 'circle' => 1, 'col' => 1, 'colgroup' => 1, 'color' => 1, 'cols' => 1, 'data' => 1, 'date' => 1, 'datetime' => 1, 'datetime-local' => 1, 'default' => 1, 'descriptions' => 1, 'email' => 1, 'file' => 1, 'get' => 1, 'groups' => 1, 'hidden' => 1, 'image' => 1, 'justify' => 1, 'left' => 1, 'ltr' => 1, 'metadata' => 1, 'middle' => 1, 'month' => 1, 'none' => 1, 'number' => 1, 'object' => 1, 'password' => 1, 'poly' => 1, 'post' => 1, 'preserve' => 1, 'radio' => 1, 'range' => 1, 'rect' => 1, 'ref' => 1, 'reset' => 1, 'right' => 1, 'row' => 1, 'rowgroup' => 1, 'rows' => 1, 'rtl' => 1, 'search' => 1, 'submit' => 1, 'subtitles' => 1, 'tel' => 1, 'text' => 1, 'time' => 1, 'top' => 1, 'url' => 1, 'week' => 1);
716
        static $eAL = array('a' => 1, 'area' => 1, 'bdo' => 1, 'button' => 1, 'col' => 1, 'fieldset' => 1, 'form' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'ol' => 1, 'optgroup' => 1, 'option' => 1, 'param' => 1, 'script' => 1, 'select' => 1, 'table' => 1, 'td' => 1, 'textarea' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1, 'track' => 1, 'xml:space' => 1);
717
        $lcase = isset($eAL[$e]) ? 1 : 0;
718
    }
719
720
    $depTr = 0;
721
    if ($C['no_deprecated_attr']) {
722
        // depr attr:applicable ele
723
        static $aND = array('align' => array('caption' => 1, 'div' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'object' => 1, 'p' => 1, 'table' => 1), 'bgcolor' => array('table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1), 'border' => array('object' => 1), 'bordercolor' => array('table' => 1, 'td' => 1, 'tr' => 1), 'cellspacing' => array('table' => 1), 'clear' => array('br' => 1), 'compact' => array('dl' => 1, 'ol' => 1, 'ul' => 1), 'height' => array('td' => 1, 'th' => 1), 'hspace' => array('img' => 1, 'object' => 1), 'language' => array('script' => 1), 'name' => array('a' => 1, 'form' => 1, 'iframe' => 1, 'img' => 1, 'map' => 1), 'noshade' => array('hr' => 1), 'nowrap' => array('td' => 1, 'th' => 1), 'size' => array('hr' => 1), 'vspace' => array('img' => 1, 'object' => 1), 'width' => array('hr' => 1, 'pre' => 1, 'table' => 1, 'td' => 1, 'th' => 1));
724
        static $eAD = array('a' => 1, 'br' => 1, 'caption' => 1, 'div' => 1, 'dl' => 1, 'form' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'map' => 1, 'object' => 1, 'ol' => 1, 'p' => 1, 'pre' => 1, 'script' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1, 'ul' => 1);
725
        $depTr = isset($eAD[$e]) ? 1 : 0;
726
    }
727
728
// attr name-vals
729
    if (strpos($a, "\x01") !== false) {
730
        $a = preg_replace('`\x01[^\x01]*\x01`', '', $a);
731
    } // No comment/CDATA sec
732
    $mode = 0;
733
    $a = trim($a, ' /');
734
    $aA = array();
735
    while (strlen($a)) {
736
        $w = 0;
737
        switch ($mode) {
738
            case 0: // Name
739
                if (preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)) {
740
                    $nm = strtolower($m[0]);
741
                    $w = $mode = 1;
742
                    $a = ltrim(substr_replace($a, '', 0, strlen($m[0])));
743
                }
744
                break;
745
            case 1:
746
                if ($a[0] == '=') { // =
747
                    $w = 1;
748
                    $mode = 2;
749
                    $a = ltrim($a, '= ');
750
                } else { // No val
751
                    $w = 1;
752
                    $mode = 0;
753
                    $a = ltrim($a);
754
                    $aA[$nm] = '';
0 ignored issues
show
Bug introduced by
The variable $nm does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
755
                }
756
                break;
757
            case 2: // Val
758
                if (preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)) {
759
                    $a = ltrim($m[2]);
760
                    $m = $m[1];
761
                    $w = 1;
762
                    $mode = 0;
763
                    $aA[$nm] = trim(str_replace('<', '&lt;', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m));
764
                }
765
                break;
766
        }
767
        if ($w == 0) { // Parse errs, deal with space, " & '
768
            $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a);
769
            $mode = 0;
770
        }
771
    }
772
    if ($mode == 1) {
773
        $aA[$nm] = '';
774
    }
775
776
// clean attrs
777
    global $S;
778
    $rl = isset($S[$e]) ? $S[$e] : array();
779
    $a = array();
780
    $nfr = 0;
781
    $d = $C['deny_attribute'];
782
    foreach ($aA as $k => $v) {
783
        if (((isset($d['*']) ? isset($d[$k]) : !isset($d[$k])) && (isset($aN[$k][$e]) or isset($aNU[$k]) or (isset($aNO[$k]) && !isset($d['on*'])) or (isset($aNA[$k]) && !isset($d['aria*'])) or (!isset($d['data*']) && preg_match('`data-((?!xml)[^:]+$)`', $k))) && !isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])) {
784
            if (isset($aNE[$k])) {
785
                $v = $k;
786
            } elseif (!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')) { // Rather loose but ?not cause issues
787
                $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v;
788
            }
789
            if ($k == 'style' && !$C['style_pass']) {
790
                if (false !== strpos($v, '&#')) {
791
                    static $sC = array('&#x20;' => ' ', '&#32;' => ' ', '&#x45;' => 'e', '&#69;' => 'e', '&#x65;' => 'e', '&#101;' => 'e', '&#x58;' => 'x', '&#88;' => 'x', '&#x78;' => 'x', '&#120;' => 'x', '&#x50;' => 'p', '&#80;' => 'p', '&#x70;' => 'p', '&#112;' => 'p', '&#x53;' => 's', '&#83;' => 's', '&#x73;' => 's', '&#115;' => 's', '&#x49;' => 'i', '&#73;' => 'i', '&#x69;' => 'i', '&#105;' => 'i', '&#x4f;' => 'o', '&#79;' => 'o', '&#x6f;' => 'o', '&#111;' => 'o', '&#x4e;' => 'n', '&#78;' => 'n', '&#x6e;' => 'n', '&#110;' => 'n', '&#x55;' => 'u', '&#85;' => 'u', '&#x75;' => 'u', '&#117;' => 'u', '&#x52;' => 'r', '&#82;' => 'r', '&#x72;' => 'r', '&#114;' => 'r', '&#x4c;' => 'l', '&#76;' => 'l', '&#x6c;' => 'l', '&#108;' => 'l', '&#x28;' => '(', '&#40;' => '(', '&#x29;' => ')', '&#41;' => ')', '&#x20;' => ':', '&#32;' => ':', '&#x22;' => '"', '&#34;' => '"', '&#x27;' => "'", '&#39;' => "'", '&#x2f;' => '/', '&#47;' => '/', '&#x2a;' => '*', '&#42;' => '*', '&#x5c;' => '\\', '&#92;' => '\\');
792
                    $v = strtr($v, $sC);
793
                }
794
                $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v);
795
                $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v;
796
            } elseif (isset($aNP[$k]) or isset($aNO[$k])) {
797
                $v = str_replace("­", ' ', (strpos($v, '&') !== false ? str_replace(array('&#xad;', '&#173;', '&shy;'), ' ', $v) : $v)); # double-quoted char: soft-hyphen; appears here as "­" or hyphen or something else depending on viewing software
798
                if ($k == 'srcset') {
799
                    $v2 = '';
800
                    foreach (explode(',', $v) as $k1 => $v1) {
801
                        $v1 = explode(' ', ltrim($v1), 2);
802
                        $k1 = isset($v1[1]) ? trim($v1[1]) : '';
803
                        $v1 = trim($v1[0]);
804
                        if (isset($v1[0])) {
805
                            $v2 .= hl_prot($v1, $k).(empty($k1) ? '' : ' '.$k1).', ';
806
                        }
807
                    }
808
                    $v = trim($v2, ', ');
809
                }
810
                if ($k == 'itemtype') {
811
                    $v2 = '';
812
                    foreach (explode(' ', $v) as $v1) {
813
                        if (isset($v1[0])) {
814
                            $v2 .= hl_prot($v1, $k).' ';
815
                        }
816
                    }
817
                    $v = trim($v2, ' ');
818
                } else {
819
                    $v = hl_prot($v, $k);
820
                }
821
                if ($k == 'href') { // X-spam
822
                    if ($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0) {
823
                        $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v);
824
                    } elseif ($C['anti_link_spam']) {
825
                        $r1 = $C['anti_link_spam'][1];
826
                        if (!empty($r1) && preg_match($r1, $v)) {
827
                            continue;
828
                        }
829
                        $r0 = $C['anti_link_spam'][0];
830
                        if (!empty($r0) && preg_match($r0, $v)) {
831
                            if (isset($a['rel'])) {
832
                                if (!preg_match('`\bnofollow\b`i', $a['rel'])) {
833
                                    $a['rel'] .= ' nofollow';
834
                                }
835
                            } elseif (isset($aA['rel'])) {
836
                                if (!preg_match('`\bnofollow\b`i', $aA['rel'])) {
837
                                    $nfr = 1;
838
                                }
839
                            } else {
840
                                $a['rel'] = 'nofollow';
841
                            }
842
                        }
843
                    }
844
                }
845
            }
846
            if (isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0) {
847
                continue;
848
            }
849
            $a[$k] = str_replace('"', '&quot;', $v);
850
        }
851
    }
852
    if ($nfr) {
853
        $a['rel'] = isset($a['rel']) ? $a['rel'].' nofollow' : 'nofollow';
854
    }
855
856
// rqd attr
857
    static $eAR = array('area' => array('alt' => 'area'), 'bdo' => array('dir' => 'ltr'), 'command' => array('label' => ''), 'form' => array('action' => ''), 'img' => array('src' => '', 'alt' => 'image'), 'map' => array('name' => ''), 'optgroup' => array('label' => ''), 'param' => array('name' => ''), 'style' => array('scoped' => ''), 'textarea' => array('rows' => '10', 'cols' => '50'));
858
    if (isset($eAR[$e])) {
859
        foreach ($eAR[$e] as $k => $v) {
860
            if (!isset($a[$k])) {
861
                $a[$k] = isset($v[0]) ? $v : $k;
862
            }
863
        }
864
    }
865
866
// depr attr
867
    if ($depTr) {
868
        $c = array();
869
        foreach ($a as $k => $v) {
870
            if ($k == 'style' or !isset($aND[$k][$e])) {
871
                continue;
872
            }
873
            $v = str_replace(array('\\', ':', ';', '&#'), '', $v);
874
            if ($k == 'align') {
875
                unset($a['align']);
876
                if ($e == 'img' && ($v == 'left' or $v == 'right')) {
877
                    $c[] = 'float: '.$v;
878
                } elseif (($e == 'div' or $e == 'table') && $v == 'center') {
879
                    $c[] = 'margin: auto';
880
                } else {
881
                    $c[] = 'text-align: '.$v;
882
                }
883
            } elseif ($k == 'bgcolor') {
884
                unset($a['bgcolor']);
885
                $c[] = 'background-color: '.$v;
886
            } elseif ($k == 'border') {
887
                unset($a['border']);
888
                $c[] = "border: {$v}px";
889
            } elseif ($k == 'bordercolor') {
890
                unset($a['bordercolor']);
891
                $c[] = 'border-color: '.$v;
892
            } elseif ($k == 'cellspacing') {
893
                unset($a['cellspacing']);
894
                $c[] = "border-spacing: {$v}px";
895 View Code Duplication
            } elseif ($k == 'clear') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
896
                unset($a['clear']);
897
                $c[] = 'clear: '.($v != 'all' ? $v : 'both');
898
            } elseif ($k == 'compact') {
899
                unset($a['compact']);
900
                $c[] = 'font-size: 85%';
901
            } elseif ($k == 'height' or $k == 'width') {
902
                unset($a[$k]);
903
                $c[] = $k.': '.($v[0] != '*' ? $v.(ctype_digit($v) ? 'px' : '') : 'auto');
904
            } elseif ($k == 'hspace') {
905
                unset($a['hspace']);
906
                $c[] = "margin-left: {$v}px; margin-right: {$v}px";
907
            } elseif ($k == 'language' && !isset($a['type'])) {
908
                unset($a['language']);
909
                $a['type'] = 'text/'.strtolower($v);
910
            } elseif ($k == 'name') {
911
                if ($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')) {
912
                    unset($a['name']);
913
                }
914
                if (!isset($a['id']) && !preg_match('`\W`', $v)) {
915
                    $a['id'] = $v;
916
                }
917
            } elseif ($k == 'noshade') {
918
                unset($a['noshade']);
919
                $c[] = 'border-style: none; border: 0; background-color: gray; color: gray';
920
            } elseif ($k == 'nowrap') {
921
                unset($a['nowrap']);
922
                $c[] = 'white-space: nowrap';
923 View Code Duplication
            } elseif ($k == 'size') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
924
                unset($a['size']);
925
                $c[] = 'size: '.$v.'px';
926
            } elseif ($k == 'vspace') {
927
                unset($a['vspace']);
928
                $c[] = "margin-top: {$v}px; margin-bottom: {$v}px";
929
            }
930
        }
931
        if (count($c)) {
932
            $c = implode('; ', $c);
933
            $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$c.';' : $c.';';
934
        }
935
    }
936
// unique ID
937
    if ($C['unique_ids'] && isset($a['id'])) {
938
        if (preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)) {
939
            unset($a['id']);
940
        } else {
941
            while (isset($GLOBALS['hl_Ids'][$id])) {
942
                $id = $C['unique_ids'].$id;
943
            }
944
            $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1;
945
        }
946
    }
947
// xml:lang
948
    if ($C['xml:lang'] && isset($a['lang'])) {
949
        $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang'];
950
        if ($C['xml:lang'] == 2) {
951
            unset($a['lang']);
952
        }
953
    }
954
// for transformed tag
955
    if (!empty($trt)) {
956
        $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$trt : $trt;
957
    }
958
// return with empty ele /
959
    if (empty($C['hook_tag'])) {
960
        $aA = '';
961
        foreach ($a as $k => $v) {
962
            $aA .= " {$k}=\"{$v}\"";
963
        }
964
        return "<{$e}{$aA}".(isset($eE[$e]) ? ' /' : '').'>';
965
    } else {
966
        return $C['hook_tag']($e, $a);
967
    }
968
}
969
970
function hl_tag2(&$e, &$a, $t = 1) {
971
// transform tag
972
    if ($e == 'big') {
973
        $e = 'span';
974
        return 'font-size: larger;';
975
    }
976
    if ($e == 's' or $e == 'strike') {
977
        $e = 'span';
978
        return 'text-decoration: line-through;';
979
    }
980
    if ($e == 'tt') {
981
        $e = 'code';
982
        return '';
983
    }
984
    if ($e == 'center') {
985
        $e = 'div';
986
        return 'text-align: center;';
987
    }
988
    static $fs = array('0' => 'xx-small', '1' => 'xx-small', '2' => 'small', '3' => 'medium', '4' => 'large', '5' => 'x-large', '6' => 'xx-large', '7' => '300%', '-1' => 'smaller', '-2' => '60%', '+1' => 'larger', '+2' => '150%', '+3' => '200%', '+4' => '300%');
989
    if ($e == 'font') {
990
        $a2 = '';
991
        while (preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)) {
992
            $a = str_replace($m[0], ' ', $a);
993
            $a2 .= strtolower($m[2]) == 'color' ? (' color: '.str_replace('"', '\'', trim($m[4])).';') : (isset($fs[($m = trim($m[4]))]) ? ($a2 .= ' font-size: '.str_replace('"', '\'', $fs[$m]).';') : '');
994
        }
995
        while (preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)) {
996
            $a = str_replace($m[0], ' ', $a);
997
            $a2 .= ' font-family: '.str_replace('"', '\'', trim($m[3])).';';
998
        }
999
        $e = 'span';
1000
        return ltrim(str_replace('<', '', $a2));
1001
    }
1002
    if ($e == 'acronym') {
1003
        $e = 'abbr';
1004
        return '';
1005
    }
1006
    if ($e == 'dir') {
1007
        $e = 'ul';
1008
        return '';
1009
    }
1010
    if ($t == 2) {
1011
        $e = 0;
1012
        return 0;
1013
    }
1014
    return '';
1015
}
1016
1017
function hl_tidy($t, $w, $p) {
1018
// tidy/compact HTM
1019
    if (strpos(' pre,script,textarea', "$p,")) {
1020
        return $t;
1021
    }
1022
    function hl_aux2($m) {
1023
        return $m[1].str_replace(array("<", ">", "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]).$m[4];
1024
    }
1025
1026
    $t = preg_replace(array('`(<\w[^>]*(?<!/)>)\s+`', '`\s+`', '`(<\w[^>]*(?<!/)>) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), 'hl_aux2', $t));
1027
    if (($w = strtolower($w)) == -1) {
1028
        return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1029
    }
1030
    $s = strpos(" $w", 't') ? "\t" : ' ';
1031
    $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2));
1032
    $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0;
1033
    $a = array('br' => 1);
1034
    $b = array('button' => 1, 'command' => 1, 'input' => 1, 'option' => 1, 'param' => 1, 'track' => 1);
1035
    $c = array('audio' => 1, 'canvas' => 1, 'caption' => 1, 'dd' => 1, 'dt' => 1, 'figcaption' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'isindex' => 1, 'label' => 1, 'legend' => 1, 'li' => 1, 'object' => 1, 'p' => 1, 'pre' => 1, 'style' => 1, 'summary' => 1, 'td' => 1, 'textarea' => 1, 'th' => 1, 'video' => 1);
1036
    $d = array('address' => 1, 'article' => 1, 'aside' => 1, 'blockquote' => 1, 'center' => 1, 'colgroup' => 1, 'datalist' => 1, 'details' => 1, 'dir' => 1, 'div' => 1, 'dl' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'form' => 1, 'header' => 1, 'hgroup' => 1, 'hr' => 1, 'iframe' => 1, 'main' => 1, 'map' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'ol' => 1, 'optgroup' => 1, 'rbc' => 1, 'rtc' => 1, 'ruby' => 1, 'script' => 1, 'section' => 1, 'select' => 1, 'table' => 1, 'tbody' => 1, 'tfoot' => 1, 'thead' => 1, 'tr' => 1, 'ul' => 1);
1037
    $T = explode('<', $t);
1038
    $X = 1;
1039
    while ($X) {
1040
        $n = $N;
1041
        $t = $T;
1042
        ob_start();
1043
        if (isset($d[$p])) {
1044
            echo str_repeat($s, ++$n);
1045
        }
1046
        echo ltrim(array_shift($t));
1047
        for ($i = -1, $j = count($t); ++$i < $j;) {
1048
            $r = '';
1049
            list($e, $r) = explode('>', $t[$i]);
1050
            $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1));
1051
            $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0);
1052
            $e = "<$e>";
1053
            if (isset($d[$y])) {
1054
                if (!$x) {
1055
                    if ($n) {
1056
                        echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);
1057
                    } else {
1058
                        ++$N;
1059
                        ob_end_clean();
1060
                        continue 2;
1061
                    }
1062
                } else {
1063
                    echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));
1064
                }
1065
                echo $r;
1066
                continue;
1067
            }
1068
            $f = "\n".str_repeat($s, $n);
1069
            if (isset($c[$y])) {
1070
                if (!$x) {
1071
                    echo $e, $f, $r;
1072
                } else {
1073
                    echo $f, $e, $r;
1074
                }
1075
            } elseif (isset($b[$y])) {
1076
                echo $f, $e, $r;
1077
            } elseif (isset($a[$y])) {
1078
                echo $e, $f, $r;
1079
            } elseif (!$y) {
1080
                echo $f, $e, $f, $r;
1081
            } else {
1082
                echo $e, $r;
1083
            }
1084
        }
1085
        $X = 0;
1086
    }
1087
    $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()));
1088
    ob_end_clean();
1089
    if (($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)) {
1090
        $t = str_replace("\n", $l, $t);
1091
    }
1092
    return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1093
}
1094
1095
function hl_version() {
1096
// version
1097
    return '1.2.4';
1098
}
1099