@@ -262,11 +262,22 @@ private function fileExcerpt(string $file, int $line, int $srcContext = 3): stri
262262// highlight_file could throw warnings
263263// see https://bugs.php.net/25725
264264$ code = @highlight_file ($ file ,true );
265- // remove main code/span tags
266- $ code =preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' ,'\\1 ' ,$ code );
267- // split multiline spans
268- $ code =preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' ,fn ($ m ) =>"<span $ m [1 ]> " .str_replace ('<br /> ' ,"</span><br /><span $ m [1 ]> " ,$ m [2 ]).'</span> ' ,$ code );
269- $ content =explode ('<br /> ' ,$ code );
265+
266+ if (\PHP_VERSION_ID >=80300 ) {
267+ // remove main pre/code tags
268+ $ code =preg_replace ('#^<pre.*?>\s*<code.*?>(.*)</code>\s*</pre>#s ' ,'\\1 ' ,$ code );
269+ // split multiline code tags
270+ $ code =preg_replace_callback ('#<code ([^>]++)>((?:[^<]*+ \\n)++[^<]*+)</code># ' ,fn ($ m ) =>"<code $ m [1 ]> " .str_replace ("\n" ,"</code> \n<code $ m [1 ]> " ,$ m [2 ]).'</code> ' ,$ code );
271+ // Convert spaces to html entities to preserve indentation when rendered
272+ $ code =str_replace (' ' ,' ' ,$ code );
273+ $ content =explode ("\n" ,$ code );
274+ }else {
275+ // remove main code/span tags
276+ $ code =preg_replace ('#^<code.*?>\s*<span.*?>(.*)</span>\s*</code>#s ' ,'\\1 ' ,$ code );
277+ // split multiline spans
278+ $ code =preg_replace_callback ('#<span ([^>]++)>((?:[^<]*+<br \/>)++[^<]*+)</span># ' ,fn ($ m ) =>"<span $ m [1 ]> " .str_replace ('<br /> ' ,"</span><br /><span $ m [1 ]> " ,$ m [2 ]).'</span> ' ,$ code );
279+ $ content =explode ('<br /> ' ,$ code );
280+ }
270281
271282$ lines = [];
272283if (0 >$ srcContext ) {