Completed
Push — master ( 58651e...a7279f )
by Adam
12s queued 10s
created

htmLawed.php ➔ hl_aux2()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
ccs 0
cts 3
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
/*
4
htmLawed 1.2.4.1, 12 September 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
/**
13
 * @param string $t
14
 * @param int|array $C
15
 * @param array|string $S
16
 * @return string
17
 */
18
function htmLawed($t, $C = 1, $S = array()) {
19 1731
    $C = is_array($C) ? $C : array();
20 1731
    if (!empty($C['valid_xhtml'])) {
21
        $C['elements'] = empty($C['elements']) ? '*-acronym-big-center-dir-font-isindex-s-strike-tt' : $C['elements'];
22
        $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2;
23
        $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2;
24
    }
25
// config eles
26 1731
    $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
27
28 1731
    if (!empty($C['safe'])) {
29 559
        unset($e['applet'], $e['audio'], $e['canvas'], $e['embed'], $e['iframe'], $e['object'], $e['script'], $e['video']);
30 559
    }
31 1731
    $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*';
32 1731
    if ($x == '-*') {
33
        $e = array();
34 1731
    } elseif (strpos($x, '*') === false) {
35
        $e = array_flip(explode(',', $x));
36
    } else {
37 1731
        if (isset($x[1])) {
38 1163
            preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER);
39 1163
            for ($i = count($m); --$i >= 0;) {
40 1163
                $m[$i] = $m[$i][0];
41 1163
            }
42 1163
            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...
43 1163
                if ($v[0] == '+') {
44
                    $e[substr($v, 1)] = 1;
45
                }
46 1163
                if ($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'.$v, $m)) {
47 1163
                    unset($e[$v]);
48 1163
                }
49 1163
            }
50 1163
        }
51
    }
52 1731
    $C['elements'] =& $e;
53
// config attrs
54 1731
    $x = !empty($C['deny_attribute']) ? strtolower(str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute'])) : '';
55 1731
    $x = array_flip((isset($x[0]) && $x[0] == '*') ? str_replace('/', 'data-', explode('-', str_replace('data-', '/', $x))) : explode(',', $x.(!empty($C['safe']) ? ',on*' : '')));
56 1731
    $C['deny_attribute'] = $x;
57
// config URLs
58 1731
    $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';
59 1731
    $C['schemes'] = array();
60 1731
    foreach (explode(';', str_replace(array(' ', "\t", "\r", "\n"), '', $x)) as $v) {
61 1731
        $x = $x2 = null;
62 1731
        list($x, $x2) = explode(':', $v, 2);
63 1731
        if ($x2) {
64 1731
            $C['schemes'][$x] = array_flip(explode(',', $x2));
65 1731
        }
66 1731
    }
67 1731
    if (!isset($C['schemes']['*'])) {
68
        $C['schemes']['*'] = array('file' => 1, 'http' => 1, 'https' => 1);
69
        if (empty($C['safe'])) {
70
            $C['schemes']['*'] += array('data' => 1, 'javascript' => 1);
71
        }
72
    }
73 1731
    if (!empty($C['safe']) && empty($C['schemes']['style'])) {
74 559
        $C['schemes']['style'] = array('!' => 1);
75 559
    }
76 1731
    $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0;
77 1731
    if (!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])) {
78 1731
        $C['base_url'] = $C['abs_url'] = 0;
79 1731
    }
80
// config rest
81 1731
    $C['and_mark'] = empty($C['and_mark']) ? 0 : 1;
82 1731
    $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;
83 1731
    $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0;
84 1731
    $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1;
85 1731
    $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0);
86 1731
    $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char'];
87 1731
    $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0);
88 1731
    $C['css_expression'] = empty($C['css_expression']) ? 0 : 1;
89 1731
    $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1;
90 1731
    $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1;
91 1731
    $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0;
92 1731
    $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0;
93 1731
    $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6;
94 1731
    $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1;
95 1731
    $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1;
96 1731
    $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1;
97 1731
    $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1;
98 1731
    $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body';
99 1731
    $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0;
100 1731
    $C['style_pass'] = empty($C['style_pass']) ? 0 : 1;
101 1731
    $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy'];
102 1731
    $C['unique_ids'] = isset($C['unique_ids']) && (!preg_match('`\W`', $C['unique_ids'])) ? $C['unique_ids'] : 1;
103 1731
    $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0;
104
105 1731
    if (isset($GLOBALS['C'])) {
106 1730
        $reC = $GLOBALS['C'];
107 1730
    }
108 1731
    $GLOBALS['C'] = $C;
109 1731
    $S = is_array($S) ? $S : hl_spec($S);
110 1731
    if (isset($GLOBALS['S'])) {
111 1730
        $reS = $GLOBALS['S'];
112 1730
    }
113 1731
    $GLOBALS['S'] = $S;
114
115 1731
    $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t);
116 1731
    if ($C['clean_ms_char']) {
117
        $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;');
118
        $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" => '"'));
119
        $t = strtr($t, $x);
120
    }
121 1731
    if ($C['cdata'] or $C['comment']) {
122 1172
        $t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);
123 1172
    }
124 1731
    $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));
125 1731
    if ($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])) {
126 1
        $GLOBALS['hl_Ids'] = array();
127 1
    }
128 1731
    if ($C['hook']) {
129
        $t = $C['hook']($t, $C, $S);
130
    }
131 1731
    if ($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])) {
132
        $GLOBALS[$C['show_setting']] = array('config' => $C, 'spec' => $S, 'time' => microtime());
133
    }
134
// main
135 1731
    $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t);
136 1731
    $t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t;
137 1731
    $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t;
138 1731
    $t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t;
139 1731
    unset($C, $e);
140 1731
    if (isset($reC)) {
141 1730
        $GLOBALS['C'] = $reC;
142 1730
    }
143 1731
    if (isset($reS)) {
144 1730
        $GLOBALS['S'] = $reS;
145 1730
    }
146 1731
    return $t;
147
}
148
149
function hl_attrval($a, $t, $p) {
150
// check attr val against $S
151
    static $ma = array('accesskey', 'class', 'itemtype', 'rel');
152
    $s = in_array($a, $ma) ? ' ' : ($a == 'srcset' ? ',' : '');
153
    $r = array();
154
    $t = !empty($s) ? explode($s, $t) : array($t);
155
    foreach ($t as $tk => $tv) {
156
    $o = 1;
157
        $tv = trim($tv);
158
        $l = strlen($tv);
159
    foreach ($p as $k => $v) {
160
            if (!$l) {
161
                continue;
162
            }
163
        switch ($k) {
164
            case 'maxlen':
165
                if ($l > $v) {
166
                    $o = 0;
167
                }
168
                break;
169
            case 'minlen':
170
                if ($l < $v) {
171
                    $o = 0;
172
                }
173
                break;
174
            case 'maxval':
175
                    if ((float)($tv) > $v) {
176
                    $o = 0;
177
                }
178
                break;
179
            case 'minval':
180
                    if ((float)($tv) < $v) {
181
                    $o = 0;
182
                }
183
                break;
184
            case 'match':
185
                    if (!preg_match($v, $tv)) {
186
                    $o = 0;
187
                }
188
                break;
189
            case 'nomatch':
190
                    if (preg_match($v, $tv)) {
191
                    $o = 0;
192
                }
193
                break;
194 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...
195
                $m = 0;
196
                foreach (explode('|', $v) as $n) {
197
                        if ($tv == $n) {
198
                        $m = 1;
199
                        break;
200
                    }
201
                }
202
                $o = $m;
203
                break;
204 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...
205
                $m = 1;
206
                foreach (explode('|', $v) as $n) {
207
                        if ($tv == $n) {
208
                        $m = 0;
209
                        break;
210
                    }
211
                }
212
                $o = $m;
213
                break;
214
            default:
215
                break;
216
        }
217
        if (!$o) {
218
            break;
219
        }
220
    }
221
        if ($o) {
222
            $r[] = $tv;
223
        }
224
    }
225
    if ($s == ',') {
226
        $s = ', ';
227
    }
228
    $r = implode($s, $r);
229
    return (isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0));
230
}
231
232
function hl_bal($t, $do = 1, $in = 'div') {
233
// balance tags
234
// by content
235 1731
    $cB = array('form' => 1, 'map' => 1, 'noscript' => 1); // Block
236 1731
    $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
237 1731
    $cF = array('a' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'button' => 1, 'blockquote' => 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
238 1731
    $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
239 1731
    $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
240 1731
    $cN2 = array_keys($cN);
241 1731
    $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
242 1731
    if ($GLOBALS['C']['direct_list_nest']) {
243 613
        $cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu' => 1, 'ol' => 1, 'ul' => 1);
244 613
    }
245 1731
    $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
246 1731
    $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
247
// block/inline type; a/ins/del both type; #pcdata: text
248 1731
    $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);
249 1731
    $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);
250 1731
    $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
251 1731
    $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
252 1731
    $eF = $eB + $eI;
253
254
// $in sets allowed child
255 1731
    $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div';
256 1731
    if (isset($cE[$in])) {
257
        return (!$do ? '' : str_replace(array('<', '>'), array('&lt;', '&gt;'), $t));
258
    }
259 1731
    if (isset($cS[$in])) {
260
        $inOk = $cS[$in];
261 1731
    } elseif (isset($cI[$in])) {
262
        $inOk = $eI;
263
        $cI['del'] = 1;
264
        $cI['ins'] = 1;
265 1731
    } elseif (isset($cF[$in])) {
266 1731
        $inOk = $eF;
267 1731
        unset($cI['del'], $cI['ins']);
268 1731
    } elseif (isset($cB[$in])) {
269
        $inOk = $eB;
270
        unset($cI['del'], $cI['ins']);
271
    }
272 1731
    if (isset($cO[$in])) {
273
        $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...
274
    }
275 1731
    if (isset($cN[$in])) {
276
        $inOk = array_diff_assoc($inOk, $cN[$in]);
277
    }
278
279 1731
    $t = explode('<', $t);
280 1731
    $ok = $q = array(); // $q seq list of open non-empty ele
281 1731
    ob_start();
282
283 1731
    for ($i = -1, $ci = count($t); ++$i < $ci;) {
284
        // allowed $ok in parent $p
285 1731 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...
286 298
            $p = array_pop($q);
287 298
            $q[] = $p;
288 298
            if (isset($cS[$p])) {
289 27
                $ok = $cS[$p];
290 298
            } elseif (isset($cI[$p])) {
291 18
                $ok = $eI;
292 18
                $cI['del'] = 1;
293 18
                $cI['ins'] = 1;
294 279
            } elseif (isset($cF[$p])) {
295 265
                $ok = $eF;
296 265
                unset($cI['del'], $cI['ins']);
297 265
            } elseif (isset($cB[$p])) {
298
                $ok = $eB;
299
                unset($cI['del'], $cI['ins']);
300
            }
301 298
            if (isset($cO[$p])) {
302 2
                $ok = $ok + $cO[$p];
303 2
            }
304 298
            if (isset($cN[$p])) {
305 191
                $ok = array_diff_assoc($ok, $cN[$p]);
306 191
            }
307 298
        } else {
308 1731
            $ok = $inOk;
309 1731
            unset($cI['del'], $cI['ins']);
310
        }
311
        // bad tags, & ele content
312 1731 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...
313
            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...
314
        }
315 1731 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...
316 284
            if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
317
                echo '<div>', $x, '</div>';
318 284
            } elseif ($do < 3 or isset($ok['#pcdata'])) {
319 284
                echo $x;
320 284
            } elseif (strpos($x, "\x02\x04")) {
321
                foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
322
                    echo(substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
323
                }
324
            } elseif ($do > 4) {
325
                echo preg_replace('`\S`', '', $x);
326
            }
327 284
        }
328
        // get markup
329 1731
        if (!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)) {
330 1731
            $x = $t[$i];
331 1731
            continue;
332
        }
333 946
        $s = null;
334 946
        $e = null;
335 946
        $a = null;
336 946
        $x = null;
337 946
        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...
338
        // close tag
339 946
        if ($s) {
340 298
            if (isset($cE[$e]) or !in_array($e, $q)) {
341 23
                continue;
342
            } // Empty/unopen
343 287
            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...
344 286
                array_pop($q);
345 286
                echo '</', $e, '>';
346 286
                unset($e);
347 286
                continue;
348
            } // Last open
349 1
            $add = ''; // Nesting - close open tags that need to be
350 1
            for ($j = -1, $cj = count($q); ++$j < $cj;) {
351 1
                if (($d = array_pop($q)) == $e) {
352 1
                    break;
353
                } else {
354 1
                    $add .= "</{$d}>";
355
                }
356 1
            }
357 1
            echo $add, '</', $e, '>';
358 1
            unset($e);
359 1
            continue;
360
        }
361
        // open tag
362
        // $cB ele needs $eB ele as child
363 946
        if (isset($cB[$e]) && strlen(trim($x))) {
364
            $t[$i] = "{$e}{$a}>";
365
            array_splice($t, $i + 1, 0, 'div>'.$x);
366
            unset($e, $x);
367
            ++$ci;
368
            --$i;
369
            continue;
370
        }
371 946
        if ((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])) {
372
            array_splice($t, $i, 0, 'div>');
373
            unset($e, $x);
374
            ++$ci;
375
            --$i;
376
            continue;
377
        }
378
        // if no open ele, $in = parent; mostly immediate parent-child relation should hold
379 946
        if (!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)) {
380 946
            if (!isset($ok[$e])) {
381 20
                if ($ql && isset($cT[$p])) {
382
                    echo '</', array_pop($q), '>';
383
                    unset($e, $x);
384
                    --$i;
385
                }
386 20
                continue;
387
            }
388 937
            if ($e !== 'span' || !empty($a)) {
389 927
                if (!isset($cE[$e])) {
390 359
                    $q[] = $e;
391 359
                }
392 927
                echo '<', $e, $a, '>';
393 927
            }
394 937
            unset($e);
395 937
            continue;
396
        }
397
        // specific parent-child
398
        if (isset($cS[$p][$e])) {
399
            if (!isset($cE[$e])) {
400
                $q[] = $e;
401
            }
402
            echo '<', $e, $a, '>';
403
            unset($e);
404
            continue;
405
        }
406
        // nesting
407
        $add = '';
408
        $q2 = array();
409
        for ($k = -1, $kc = count($q); ++$k < $kc;) {
410
            $d = $q[$k];
411
            $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...
412
            if (isset($cS[$d])) {
413
                $q2[] = $d;
414
                continue;
415
            }
416
            $ok2 = isset($cI[$d]) ? $eI : $eF;
417
            if (isset($cO[$d])) {
418
                $ok2 = $ok2 + $cO[$d];
419
            }
420
            if (isset($cN[$d])) {
421
                $ok2 = array_diff_assoc($ok2, $cN[$d]);
422
            }
423
            if (!isset($ok2[$e])) {
424
                if (!$k && !isset($inOk[$e])) {
425
                    continue 2;
426
                }
427
                $add = "</{$d}>";
428
                for (; ++$k < $kc;) {
429
                    $add = "</{$q[$k]}>{$add}";
430
                }
431
                break;
432
            } else {
433
                $q2[] = $d;
434
            }
435
        }
436
        $q = $q2;
437
        if (!isset($cE[$e])) {
438
            $q[] = $e;
439
        }
440
        echo $add, '<', $e, $a, '>';
441
        unset($e);
442
        continue;
443
    }
444
445
// end
446 1731 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...
447 111
        $p = array_pop($q);
448 111
        $q[] = $p;
449 111
        if (isset($cS[$p])) {
450 28
            $ok = $cS[$p];
451 111
        } elseif (isset($cI[$p])) {
452 2
            $ok = $eI;
453 2
            $cI['del'] = 1;
454 2
            $cI['ins'] = 1;
455 84
        } elseif (isset($cF[$p])) {
456 82
            $ok = $eF;
457 82
            unset($cI['del'], $cI['ins']);
458 82
        } elseif (isset($cB[$p])) {
459
            $ok = $eB;
460
            unset($cI['del'], $cI['ins']);
461
        }
462 111
        if (isset($cO[$p])) {
463
            $ok = $ok + $cO[$p];
464
        }
465 111
        if (isset($cN[$p])) {
466 10
            $ok = array_diff_assoc($ok, $cN[$p]);
467 10
        }
468 111
    } else {
469 1657
        $ok = $inOk;
470 1657
        unset($cI['del'], $cI['ins']);
471
    }
472 1731 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...
473
        echo '&lt;', $s, $e, $a, '&gt;';
474
    }
475 1731 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...
476 499
        if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
477
            echo '<div>', $x, '</div>';
478 499
        } elseif ($do < 3 or isset($ok['#pcdata'])) {
479 499
            echo $x;
480 499
        } elseif (strpos($x, "\x02\x04")) {
481
            foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
482
                echo(substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
483
            }
484
        } elseif ($do > 4) {
485
            echo preg_replace('`\S`', '', $x);
486
        }
487 499
    }
488 1731
    while (!empty($q) && ($e = array_pop($q))) {
489 111
        echo '</', $e, '>';
490 111
    }
491 1731
    $o = ob_get_contents();
492 1731
    ob_end_clean();
493 1731
    return $o;
494
}
495
496
function hl_cmtcd($t) {
497
// comment/CDATA sec handler
498 29
    $t = $t[0];
499 29
    global $C;
500 29
    if (!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])) {
501
        return $t;
502
    }
503 29
    if ($v == 1) {
504 29
        return '';
505
    }
506
    if ($n == 'comment' && $v < 4) {
507
        if (substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' ') {
508
            $t .= ' ';
509
        }
510
    } else {
511
        $t = substr($t, 1, -1);
512
    }
513
    $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $t) : $t;
514
    return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01"));
515
}
516
517
function hl_ent($t) {
518
// entitity handler
519 249
    global $C;
520 249
    $t = $t[1];
521 249
    static $U = array('quot' => 1, 'amp' => 1, 'lt' => 1, 'gt' => 1);
522 249
    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');
523 249
    if ($t[0] != '#') {
524 147
        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)).';';
525
    }
526 114
    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))) {
527 37
        return ($C['and_mark'] ? "\x06" : '&')."amp;#{$t};";
528
    }
529 78
    return ($C['and_mark'] ? "\x06" : '&').'#'.(((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'.dechex($n)).';';
530
}
531
532
function hl_prot($p, $c = null) {
533
// check URL scheme
534 566
    global $C;
535 566
    $b = $a = '';
536 566
    if ($c == null) {
537 17
        $c = 'style';
538 17
        $b = $p[1];
539 17
        $a = $p[3];
540 17
        $p = trim($p[2]);
541 17
    }
542 566
    $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*'];
543 566
    static $d = 'denied:';
544 566
    if (isset($c['!']) && substr($p, 0, 7) != $d) {
545 12
        $p = "$d$p";
546 12
    }
547 566
    if (isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)) {
548 127
        return "{$b}{$p}{$a}";
549
    } // All ok, frag, query, param
550 545
    if (preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])) { // Denied prot
551 324
        return "{$b}{$d}{$p}{$a}";
552
    }
553 223
    if ($C['abs_url']) {
554
        if ($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0) { // Make url rel
555
            $p = substr($p, strlen($C['base_url']));
556
        } elseif (empty($m[1])) { // Make URL abs
557
            if (substr($p, 0, 2) == '//') {
558
                $p = substr($C['base_url'], 0, strpos($C['base_url'], ':') + 1).$p;
559
            } elseif ($p[0] == '/') {
560
                $p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']).$p;
561
            } elseif (strcspn($p, './')) {
562
                $p = $C['base_url'].$p;
563
            } else {
564
                preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m);
565
                $p = preg_replace('`(?<=/)\./`', '', $m[2].$p);
566
                while (preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)) {
567
                    $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p);
568
                }
569
                $p = $m[1].$p;
570
            }
571
        }
572
    }
573 223
    return "{$b}{$p}{$a}";
574
}
575
576
function hl_regex($p) {
577
// check regex
578 1154
    if (empty($p)) {
579
        return 0;
580
    }
581 1154
    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...
582 1154
        error_clear_last();
583 1154 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...
584
        if ($t = ini_get('track_errors')) {
585
            $o = isset($php_errormsg) ? $php_errormsg : null;
586 1154
        } else {
587 1154
            ini_set('track_errors', 1);
588 1154
        }
589 1154
        unset($php_errormsg);
590 1154
    }
591 1154
    if (($d = ini_get('display_errors'))) {
592 1154
        ini_set('display_errors', 0);
593 1154
    }
594 1154
    preg_match($p, '');
595 1154
    if ($v) {
596 1154
        $r = error_get_last() == null ? 1 : 0;
597 1154 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...
598
        $r = isset($php_errormsg) ? 0 : 1;
599
        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...
600 1154
            $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...
601
        } else {
602
            ini_set('track_errors', 0);
603
        }
604
    }
605 559
    if ($d) {
606 559
        ini_set('display_errors', 1);
607 559
    }
608 559
    return $r;
609 559
}
610 559
611
function hl_spec($t) {
612
// final $spec
613
    $s = array();
614
    if (!function_exists('hl_aux1')) {
615
        function hl_aux1($m) {
616
            return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1);
617
        }
618
    }
619
    $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t)));
620
    for ($i = count(($t = explode(';', $t))); --$i >= 0;) {
621
        $w = $t[$i];
622
        if (empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e + 1)))) {
623
            continue;
624
        }
625
        $y = $n = array();
626
        foreach (explode(',', $a) as $v) {
627
            if (!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)) {
628
                continue;
629
            }
630
            if (($x = strtolower($m[1])) == '-*') {
631
                $n['*'] = 1;
632
                continue;
633
            }
634
            if ($x[0] == '-') {
635
                $n[substr($x, 1)] = 1;
636
                continue;
637
            }
638
            if (!isset($m[2])) {
639
                $y[$x] = 1;
640
                continue;
641
            }
642
            foreach (explode('/', $m[2]) as $m) {
643
                if (empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5) {
644
                    $y[$x] = 1;
645
                    continue;
646
                }
647
                $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p + 1));
648
            }
649 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...
650
                unset($y[$x]['match']);
651
            }
652 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...
653
                unset($y[$x]['nomatch']);
654
            }
655
        }
656
        if (!count($y) && !count($n)) {
657
            continue;
658 559
        }
659
        foreach (explode(',', substr($w, 0, $e)) as $v) {
660
            if (!strlen(($v = strtolower($v)))) {
661
                continue;
662
            }
663 1637
            if (count($y)) {
664 1637
                if (!isset($s[$v])) {
665
                $s[$v] = $y;
666 1637
                } else {
667
                    $s[$v] = array_merge($s[$v], $y);
668
                }
669 1637
            }
670 200
            if (count($n)) {
671
                if (!isset($s[$v]['n'])) {
672 1637
                $s[$v]['n'] = $n;
673 91
                } else {
674 1583
                    $s[$v]['n'] = array_merge($s[$v]['n'], $n);
675 721
                }
676
            }
677
        }
678 946
    }
679
    return $s;
680 946
}
681 946
682 1
function hl_tag($t) {
683 1
// tag/attribute handler
684
    global $C;
685
    $t = $t[0];
686 1
// invalid < >
687
    if ($t == '< ') {
688 946
        return '&lt; ';
689 946
    }
690 311
    if ($t == '>') {
691
        return '&gt;';
692
    }
693
    if (!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)) {
694 946
        return str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
695 946
    } elseif (!isset($C['elements'][($e = strtolower($m[2]))])) {
696 946
        return (($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
697 946
    }
698 946
// attr string
699 946
    $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3]));
700
// tag transform
701 946
    static $eD = array('acronym' => 1, 'applet' => 1, 'big' => 1, 'center' => 1, 'dir' => 1, 'font' => 1, 'isindex' => 1, 's' => 1, 'strike' => 1, 'tt' => 1); // Deprecated
702
    if ($C['make_tag_strict'] && isset($eD[$e])) {
703 946
        $trt = hl_tag2($e, $a, $C['make_tag_strict']);
704 946
        if (!$e) {
705 946
            return (($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
706 946
        }
707
    }
708 946
// close tag
709 946
    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
710
    if (!empty($m[1])) {
711 946
        return (!isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad']) % 2 ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : ''));
712 946
    }
713 946
714 946
// open tag & attr
715
    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
716
    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
717 946
    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
718
    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
719
    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*
720 946
    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*
721 946
722 946
    if ($C['lc_std_val']) {
723 946
        // predef attr vals for $eAL & $aNE ele
724 909
        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);
725
        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);
726 909
        $lcase = isset($eAL[$e]) ? 1 : 0;
727 909
    }
728 891
729 891
    $depTr = 0;
730 891
    if ($C['no_deprecated_attr']) {
731 891
        // depr attr:applicable ele
732 909
        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));
733 891
        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);
734 891
        $depTr = isset($eAD[$e]) ? 1 : 0;
735 891
    }
736 891
737 891
// attr name-vals
738 891
    if (strpos($a, "\x01") !== false) {
739
        $a = preg_replace('`\x01[^\x01]*\x01`', '', $a);
740
    } // No comment/CDATA sec
741
    $mode = 0;
742
    $a = trim($a, ' /');
743
    $aA = array();
744 891
    while (strlen($a)) {
745 891
        $w = 0;
746 891
        switch ($mode) {
747 891
            case 0: // Name
748 891
                if (preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)) {
749 891
                    $nm = strtolower($m[0]);
750 891
                    $w = $mode = 1;
751 891
                    $a = ltrim(substr_replace($a, '', 0, strlen($m[0])));
752 891
                }
753 891
                break;
754
            case 1:
755 909
                if ($a[0] == '=') { // =
756 173
                    $w = 1;
757 173
                    $mode = 2;
758 173
                    $a = ltrim($a, '= ');
759 909
                } else { // No val
760 946
                    $w = 1;
761 1
                    $mode = 0;
762 1
                    $a = ltrim($a);
763
                    $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...
764
                }
765 946
                break;
766 946
            case 2: // Val
767 946
                if (preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)) {
768 946
                    $a = ltrim($m[2]);
769 946
                    $m = $m[1];
770 946
                    $w = 1;
771 891
                    $mode = 0;
772 699
                    $aA[$nm] = trim(str_replace('<', '&lt;', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m));
773 3
                }
774 699
                break;
775 574
        }
776 574
        if ($w == 0) { // Parse errs, deal with space, " & '
777 699
            $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a);
778 40
            $mode = 0;
779 3
        }
780 3
    }
781 3
    if ($mode == 1) {
782 40
        $aA[$nm] = '';
783 40
    }
784 699
785 550
// clean attrs
786 550
    global $S;
787
    $rl = isset($S[$e]) ? $S[$e] : array();
788
    $a = array();
789
    $nfr = 0;
790
    $d = $C['deny_attribute'];
791
    foreach ($aA as $k => $v) {
792
        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])) {
793
            if (isset($aNE[$k])) {
794
                $v = $k;
795
            } elseif (!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')) { // Rather loose but ?not cause issues
796
                $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v;
797
            }
798 550
            if ($k == 'style' && !$C['style_pass']) {
799
                if (false !== strpos($v, '&#')) {
800
                    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;' => '\\');
801
                    $v = strtr($v, $sC);
802
                }
803
                $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v);
804
                $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v;
805
            } elseif (isset($aNP[$k]) or isset($aNO[$k])) {
806
                $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
807 550
                if ($k == 'srcset') {
808
                    $v2 = '';
809 550
                    foreach (explode(',', $v) as $k1 => $v1) {
810 161
                        $v1 = explode(' ', ltrim($v1), 2);
811
                        $k1 = isset($v1[1]) ? trim($v1[1]) : '';
812 161
                        $v1 = trim($v1[0]);
813 101
                        if (isset($v1[0])) {
814 101
                            $v2 .= hl_prot($v1, $k).(empty($k1) ? '' : ' '.$k1).', ';
815
                        }
816
                    }
817 101
                    $v = trim($v2, ', ');
818 101
                }
819 101
                if ($k == 'itemtype') {
820 42
                    $v2 = '';
821 13
                    foreach (explode(' ', $v) as $v1) {
822 13
                        if (isset($v1[0])) {
823 101
                            $v2 .= hl_prot($v1, $k).' ';
824 1
                        }
825
                    }
826
                    $v = trim($v2, ' ');
827 1
                } else {
828 88
                $v = hl_prot($v, $k);
829
                }
830 101
                if ($k == 'href') { // X-spam
831 101
                    if ($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0) {
832 161
                        $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v);
833 550
                    } elseif ($C['anti_link_spam']) {
834 699
                        $r1 = $C['anti_link_spam'][1];
835
                        if (!empty($r1) && preg_match($r1, $v)) {
836
                            continue;
837 699
                        }
838 699
                        $r0 = $C['anti_link_spam'][0];
839 946
                        if (!empty($r0) && preg_match($r0, $v)) {
840 946
                            if (isset($a['rel'])) {
841
                                if (!preg_match('`\bnofollow\b`i', $a['rel'])) {
842
                                    $a['rel'] .= ' nofollow';
843
                                }
844
                            } elseif (isset($aA['rel'])) {
845 946
                                if (!preg_match('`\bnofollow\b`i', $aA['rel'])) {
846 946
                                    $nfr = 1;
847 497
                                }
848 497
                            } else {
849 488
                                $a['rel'] = 'nofollow';
850 488
                            }
851 497
                        }
852 497
                    }
853
                }
854
            }
855 946
            if (isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0) {
856 790
                continue;
857 790
            }
858 650
            $a[$k] = str_replace('"', '&quot;', $v);
859 649
        }
860
    }
861 4
    if ($nfr) {
862 4
        $a['rel'] = isset($a['rel']) ? $a['rel'].' nofollow' : 'nofollow';
863 1
    }
864 1
865
// rqd attr
866 1
    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'));
867
    if (isset($eAR[$e])) {
868
        foreach ($eAR[$e] as $k => $v) {
869 1
            if (!isset($a[$k])) {
870
                $a[$k] = isset($v[0]) ? $v : $k;
871 4
            }
872
        }
873
    }
874 3
875
// depr attr
876
    if ($depTr) {
877 3
        $c = array();
878
        foreach ($a as $k => $v) {
879
            if ($k == 'style' or !isset($aND[$k][$e])) {
880 3
                continue;
881
            }
882
            $v = str_replace(array('\\', ':', ';', '&#'), '', $v);
883 3
            if ($k == 'align') {
884
                unset($a['align']);
885
                if ($e == 'img' && ($v == 'left' or $v == 'right')) {
886 3
                    $c[] = 'float: '.$v;
887
                } elseif (($e == 'div' or $e == 'table') && $v == 'center') {
888
                    $c[] = 'margin: auto';
889 3
                } else {
890
                    $c[] = 'text-align: '.$v;
891
                }
892 3
            } elseif ($k == 'bgcolor') {
893
                unset($a['bgcolor']);
894
                $c[] = 'background-color: '.$v;
895 3
            } elseif ($k == 'border') {
896
                unset($a['border']);
897
                $c[] = "border: {$v}px";
898 3
            } elseif ($k == 'bordercolor') {
899 3
                unset($a['bordercolor']);
900
                $c[] = 'border-color: '.$v;
901
            } elseif ($k == 'cellspacing') {
902 3
                unset($a['cellspacing']);
903
                $c[] = "border-spacing: {$v}px";
904 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...
905 3
                unset($a['clear']);
906
                $c[] = 'clear: '.($v != 'all' ? $v : 'both');
907
            } elseif ($k == 'compact') {
908
                unset($a['compact']);
909
                $c[] = 'font-size: 85%';
910
            } elseif ($k == 'height' or $k == 'width') {
911
                unset($a[$k]);
912
                $c[] = $k.': '.($v[0] != '*' ? $v.(ctype_digit($v) ? 'px' : '') : 'auto');
913
            } elseif ($k == 'hspace') {
914
                unset($a['hspace']);
915
                $c[] = "margin-left: {$v}px; margin-right: {$v}px";
916
            } elseif ($k == 'language' && !isset($a['type'])) {
917
                unset($a['language']);
918 790
                $a['type'] = 'text/'.strtolower($v);
919 790
            } elseif ($k == 'name') {
920 1
                if ($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')) {
921 1
                    unset($a['name']);
922 1
                }
923 790
                if (!isset($a['id']) && !preg_match('`\W`', $v)) {
924
                    $a['id'] = $v;
925 946
                }
926
            } elseif ($k == 'noshade') {
927
                unset($a['noshade']);
928
                $c[] = 'border-style: none; border: 0; background-color: gray; color: gray';
929
            } elseif ($k == 'nowrap') {
930
                unset($a['nowrap']);
931
                $c[] = 'white-space: nowrap';
932 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...
933
                unset($a['size']);
934
                $c[] = 'size: '.$v.'px';
935
            } elseif ($k == 'vspace') {
936 946
                unset($a['vspace']);
937
                $c[] = "margin-top: {$v}px; margin-bottom: {$v}px";
938
            }
939
        }
940
        if (count($c)) {
941
            $c = implode('; ', $c);
942
            $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$c.';' : $c.';';
943 946
        }
944 1
    }
945 1
// unique ID
946
    if ($C['unique_ids'] && isset($a['id'])) {
947 946
        if (preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)) {
948 946
            unset($a['id']);
949 946
        } else {
950 772
            while (isset($GLOBALS['hl_Ids'][$id])) {
951 946
                $id = $C['unique_ids'].$id;
952 946
            }
953
            $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1;
954
        }
955
    }
956
// xml:lang
957
    if ($C['xml:lang'] && isset($a['lang'])) {
958
        $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang'];
959
        if ($C['xml:lang'] == 2) {
960 1
            unset($a['lang']);
961
        }
962
    }
963
// for transformed tag
964 1
    if (!empty($trt)) {
965
        $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$trt : $trt;
966
    }
967
// return with empty ele /
968 1
    if (empty($C['hook_tag'])) {
969
        $aA = '';
970
        foreach ($a as $k => $v) {
971
            $aA .= " {$k}=\"{$v}\"";
972 1
        }
973
        return "<{$e}{$aA}".(isset($eE[$e]) ? ' /' : '').'>';
974
    } else {
975
        return $C['hook_tag']($e, $a);
976 1
    }
977 1
}
978 1
979 1
function hl_tag2(&$e, &$a, $t = 1) {
980 1
// transform tag
981 1
    if ($e == 'big') {
982 1
        $e = 'span';
983 1
        return 'font-size: larger;';
984
    }
985
    if ($e == 's' or $e == 'strike') {
986
        $e = 'span';
987 1
        return 'text-decoration: line-through;';
988 1
    }
989
    if ($e == 'tt') {
990
        $e = 'code';
991
        return '';
992
    }
993
    if ($e == 'center') {
994
        $e = 'div';
995
        return 'text-align: center;';
996
    }
997
    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%');
998
    if ($e == 'font') {
999
        $a2 = '';
1000
        while (preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)) {
1001
            $a = str_replace($m[0], ' ', $a);
1002
            $a2 .= strtolower($m[2]) == 'color' ? (' color: '.str_replace('"', '\'', trim($m[4])).';') : (isset($fs[($m = trim($m[4]))]) ? ($a2 .= ' font-size: '.str_replace('"', '\'', $fs[$m]).';') : '');
1003
        }
1004
        while (preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)) {
1005
            $a = str_replace($m[0], ' ', $a);
1006
            $a2 .= ' font-family: '.str_replace('"', '\'', trim($m[3])).';';
1007
        }
1008
        $e = 'span';
1009
        return ltrim(str_replace('<', '', $a2));
1010
    }
1011
    if ($e == 'acronym') {
1012
        $e = 'abbr';
1013
        return '';
1014
    }
1015
    if ($e == 'dir') {
1016
        $e = 'ul';
1017
        return '';
1018
    }
1019
    if ($t == 2) {
1020
        $e = 0;
1021
        return 0;
1022
    }
1023
    return '';
1024
}
1025
1026
function hl_tidy($t, $w, $p) {
1027
// tidy/compact HTM
1028
    if (strpos(' pre,script,textarea', "$p,")) {
1029
        return $t;
1030
    }
1031
    if (!function_exists('hl_aux2')) {
1032
        function hl_aux2($m) {
1033
            return $m[1].str_replace(array("<", ">", "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]).$m[4];
1034
        }
1035
    }
1036
    $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));
1037
    if (($w = strtolower($w)) == -1) {
1038
        return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1039
    }
1040
    $s = strpos(" $w", 't') ? "\t" : ' ';
1041
    $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2));
1042
    $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0;
1043
    $a = array('br' => 1);
1044
    $b = array('button' => 1, 'command' => 1, 'input' => 1, 'option' => 1, 'param' => 1, 'track' => 1);
1045
    $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);
1046
    $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);
1047
    $T = explode('<', $t);
1048
    $X = 1;
1049
    while ($X) {
1050
        $n = $N;
1051
        $t = $T;
1052
        ob_start();
1053
        if (isset($d[$p])) {
1054
            echo str_repeat($s, ++$n);
1055
        }
1056
        echo ltrim(array_shift($t));
1057
        for ($i = -1, $j = count($t); ++$i < $j;) {
1058
            $r = '';
1059
            list($e, $r) = explode('>', $t[$i]);
1060
            $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1));
1061
            $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0);
1062
            $e = "<$e>";
1063
            if (isset($d[$y])) {
1064
                if (!$x) {
1065
                    if ($n) {
1066
                        echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);
1067
                    } else {
1068
                        ++$N;
1069
                        ob_end_clean();
1070
                        continue 2;
1071
                    }
1072
                } else {
1073
                    echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));
1074
                }
1075
                echo $r;
1076
                continue;
1077
            }
1078
            $f = "\n".str_repeat($s, $n);
1079
            if (isset($c[$y])) {
1080
                if (!$x) {
1081
                    echo $e, $f, $r;
1082
                } else {
1083
                    echo $f, $e, $r;
1084
                }
1085
            } elseif (isset($b[$y])) {
1086
                echo $f, $e, $r;
1087
            } elseif (isset($a[$y])) {
1088
                echo $e, $f, $r;
1089
            } elseif (!$y) {
1090
                echo $f, $e, $f, $r;
1091
            } else {
1092
                echo $e, $r;
1093
            }
1094
        }
1095
        $X = 0;
1096
    }
1097
    $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()));
1098
    ob_end_clean();
1099
    if (($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)) {
1100
        $t = str_replace("\n", $l, $t);
1101
    }
1102
    return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1103
}
1104
1105
function hl_version() {
1106
// version
1107
    return '1.2.4.1';
1108
}
1109