Справочники, инструменты, документация

PHP: Как подсветить синтаксис HTML-кода

Вы, наверное, не раз сталкивались с примерами подсветки кода на различных сайтах. Ну Вы же как-то учились?) В данной статье мы рассмотрим то, как самостоятельно написать скрипт подсветки синтаксиса HTML-кода средствами PHP.

Пример очень простой и Вы с лёгкостью сможете его доработать при необходимости.

function light ($str){ 
// переменные с цветами - открывающим тегом font
$a = "<font color=000000>"; $b = "<font color=0000ff>"; 
$c = "<font color=000080>"; $d = "<font color=ff0000>"; 
// слова-функции, которые будут обработаны и подсвечены
$tring="spliti preg_match_all Location elseif touch unlink split".
" abs microtime else empty eregi_replace eregi trim strlen".
" explode list int count ereg_replace substr break if echo".
" date time function usort fclose fputs fopen foreach mail".
" file_exists global sleep return is_file while getenv false".
" is_readable clearstatcache exit header array gethostbyaddr".
" setcookie sizeof flock filesize str_replace include ereg file for each"; 
$cheng = explode (" ", $tring); 
$strok = explode (" ", $str); 
$str=""; 
for($ii=0; $ii < sizeof($strok); $ii++){ 
for($i=0; $i < sizeof($cheng); $i++){ 
  if( eregi("$cheng[$i]", $strok[$ii])){ 
   preg_match_all("/(?|[?a-zA-Z0-9_%\$])($cheng[$i])([?a-zA-Z0-9_]|$)/", $strok[$ii], $array); 
   while(list($key, $val) = each ($array[0]))
  $strok[$ii] = eregi_replace ("$cheng[$i]","<b>$cheng[$i]</b>",$strok[$ii]); 
   } 
  } 
$str .= " $strok[$ii]"; 
} 
// поочередно заменяем знаки и теги на соответствующие же символы, уже выделенные цветным оформленем
$str = eregi_replace ("\(", "$b<b>(</b></font>", $str); 
$str = eregi_replace ("\)", "$b<b>)</b></font>", $str); 
$str = eregi_replace ("\{", "$b<b>{</b></font>", $str); 
$str = eregi_replace ("\}", "$b<b>}</b></font>", $str); 
$str = eregi_replace ("<\?","$d<b><?</b></font>", $str); 
$str = eregi_replace ("\?>","$d<b>?></b></font>", $str); 
$str = eregi_replace ("<html>","$d<html></font>", $str); 
$str = eregi_replace ("<\/html>","$d</html></font>", $str); 
$str = eregi_replace ("<body>","$d<body></font>", $str); 
$str = eregi_replace ("<\/body>","$d</body></font>", $str); 
$str = eregi_replace ("\?>","$d<b>?></b></font>", $str); 
$str = eregi_replace ("<html>","$d<html></font>", $str); 
$str = eregi_replace ("<\/html>","$d</html></font>", $str); 
$str = eregi_replace ("<body>","$d<body></font>", $str); 
$str = eregi_replace ("<\/body>","$d</body></font>", $str); 
$cheng = explode (" ", $str); 
$str =""; 
for($i=0; $i < sizeof($cheng); $i++){ 
if ( eregi("(?|[?\w\W]*)(\\\${1,2}[\w]*)([?\W]*|$)", $cheng[$i])){ 
preg_match_all("/(?|[?\w\W]*)(\\\${1,2}[\w]*)([?\W]*|$)/", $cheng[$i], $array); 
while(list($key, $val) = each ($array[0])){ 
list($a1,$a2) = explode ("\$",$val); 
$val_sss = "\\" ."\$" ."$a2"; 
$val = "\$"."$a2"; 
$cheng[$i] = eregi_replace ("$val_sss", "$c$val</font>", $cheng[$i]); 
} 
} 
$str .= " $cheng[$i]"; 
} 
return $str; // возвращаем html-код - текст в тегах
}

Теперь о том как вызвать функцию. Рассмотрим сложный случай, текст из файла (из строковой переменной, думаю, понятно, что будет проще):

// считываем ваш файл в массив строк и запускаем цикл
$general = @file("ваш_файл.html"); // файл с путем к нему, если в другой директории
// Напоминаю, знак @ нужен для того, чтобы в случае ошибки текст с ней не выводился пользователю
// построчный перебор текста с заменой...
for($i = 0 ; $i < count($general); $i++){ 
  // изменяем цвета слов в строках
$general[$i] = light ($general[$i]); 
  // печатаем строки с изменениями
echo" $general[$i] "; 
}

Данный список можно пополнить синтаксическими единицами иных языков: PHP, JavaScript и других.

Встроенные PHP-функции подсветки синтасиса кода

Да, есть! Это функция highlight_string. Можете попробовать указанный ниже пример.

<html>
<head>
<title>Подсветка кода с помощью стандартной функции PHP</title>
</head>
<body>

<?php
$code = '<?php
if(!$flag) {
  echo("Тут мог бы быть Hello, world");
  $var = 1;
  }
else break;
?>';
highlight_string($code)
?>

</body>
</html>

Если Вы хотите подсветить HTML-код, то для этого Вам понадобится нужный код обозначить как PHP, например, <? нужный код ?>, иначе функция его не проработает.