highlight_string

(PHP 4, PHP 5)

highlight_string -- Syntax highlighting of a string

Description

mixed highlight_string ( string str [, bool return] )

The highlight_string() function outputs a syntax highlighted version of str using the colors defined in the built-in syntax highlighter for PHP.

If the second parameter return is set to TRUE then highlight_string() will return the highlighted code as a string instead of printing it out. If the second parameter is not set to TRUE then highlight_string() will return TRUE on success, FALSE on failure.

例子 1. highlight_string() example

<?php
highlight_string
('<?php phpinfo(); ?>');
?>

The above example will output (in PHP 4):

<code><font color="#000000">
<font color="#0000BB">&lt;?php phpinfo</font><font color="#007700">(); </font><font color="#0000BB">?&gt;</font>
</font>
</code>

The above example will output (in PHP 5):

<code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php phpinfo</span><span style="color: #007700">(); </span><span style="color: #0000BB">?&gt;</span>
</span>
</code>

注: The return parameter became available in PHP 4.2.0. Before this time it behaved like the default, which is FALSE

See also highlight_file().


add a note add a note User Contributed Notes
peter at int8 dot com
20-Apr-2006 07:43
This hasn't been mentioned, but it appears that PHP opening and closing tags are required to be part of the code snippet.
<?php highlight_string("<? \$var = 15; ?>"); ?>
works, while
<?php highlight_string("\$var = 15;"); ?>
does not. This is unforunate for those of use who want to show tiny code snippets, but there you go. Earlier versions of this function did not have this requirement, if I remember correctly.
m dot lebkowski+phpnet at gmail dot com
07-Apr-2006 07:31
stalker, I`m afraid your function has a bug. Whenever a input string will contain a substring: 'color="foo.bar"' it will be replaced by your function, whitch is of course incorrect. Try this:

<?php
function xhtmlHighlightString( $str, $return=false )
{
  
$hlt = highlight_string( $str, true );
  
$ret = str_replace(
         array(
'<font color="', '</font>' ),
         array(
'<span style="color: ', '</span>' ),
        
$hlt );
   if(
$return)
         return
$ret;
   echo
$ret;
   return
true;
}

function
xhtmlHilightFile( $path, $return = false )
{
       return
xhtmlHighlightString( file_get_contents( $path ), $return );
}
?>
stalker at ruun dot de
31-Dec-2005 05:37
to vouksh: I expanded your functions a bit:

<?php
function xhtmlHighlightString($str,$return=false) {
  
$hlt = highlight_string(stripslashes($str), true);
  
$fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
  
$ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
   if(
$return)
     return
$ret;
   echo
$ret;
   return
true;
}
function
xhtmlHighlightFile($path,$return=false) {
  
$hlt = highlight_file($path, true);
  
$fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
  
$ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
   if(
$return)
     return
$ret;
   echo
$ret;
   return
true;
}
?>
06-Nov-2005 03:05
growling octopus's code didn't work under Windows, so I made this and it worked:
<?php
if (!empty($_GET['source'])) {
  
$f = file_get_contents($_SERVER['SCRIPT_FILENAME']);
  
highlight_string($f);
   exit();
}
?>
growlingoctopus at no-spam dot gmail dot com
17-Oct-2005 07:37
Here's a trick I use when I want to show people the source to one of my scripts, but don't feel like uploading phps files or the host doesn't support them.
<?php
if (!empty($_GET['source'])) {
  
$f = implode(file(substr(__FILE__,strrpos(__FILE__,'/')+1)));
  
highlight_string(trim(substr($f,strpos($f,'?'.'>')+2)));
   exit();   
}
?>
By adding that to the top of the script, you can then call the script with ?source=1 and it will show the source for the file ... it should work with any script (as long as you aren't using $_GET['source'] for something else, you can always change that if you do).
vouksh at vouksh dot info
11-Sep-2005 01:27
Fully working, XHTML 1.1 ready xhtml_highlight function. I included the stripslashes, because of some problems I had with out it. It should be safe to leave it in there, but if you experience problems, feel free to take it out.

<?
function xhtml_highlight($str) {
  
$hlt = highlight_string(stripslashes($str), true);
  
$fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
  
$ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
   echo
$ret;
   return
true;
}
?>
webmaster at gelan dot org
21-Aug-2005 02:27
Some BB-codes width preg_replace:

<?php
function bb_url($str){
return
preg_replace('#[URL=([^\']*)]([^\']*)[/URL]#', '<a href="\\1" target=_blank>\\2</a>', $str);
}
function
bb_php($str){
$str = str_replace("]\n", "]", $str);
$match = array('#\[php\](.*?)\[\/php\]#se');
$replace = array("'<div>'.highlight_string(stripslashes('$1'), true).'</div>'");
return
preg_replace($match, $replace, $str);
}
function
bb_img($str){
return
preg_replace('#[IMG]([^\']*)[/IMG]#', '<img src="\\1" />', $str);
}
function
bb_b{$str){
return
preg_replace('#[B]([^\']*)[/B]', '<strong>\\1</strong>', $str);
}
function
bb_i{$str){
return
preg_replace('#[I]([^\']*)[/I]', '<em>\\1</em>', $str);
}
function
bb_parse{$str){
$str = bb_url($str);
$str = bb_php($str);
$str = bb_img($str);
$str = bb_b($str);
$str = bb_i($str);
return
$str
}
?>
zer0
21-Jun-2005 12:18
Concerning my code below:

I'm sorry, I completely forgot about str_ireplace being for PHP 5 for some reason. Also, there was another error I missed (too many late nights ;)). Here's the corrected code:

<?php
  
function highlight_code($code, $inline=false, $return=false) // Pre php 4 support for capturing highlight
  
{
       (string)
$highlight = "";
       if (
version_compare(PHP_VERSION, "4.2.0", "<") === 1 )
       {
          
ob_start(); // start output buffering to capture contents of highlight
          
highlight_string($code);
          
$highlight = ob_get_contents(); // capture output
          
ob_end_clean(); // clear buffer cleanly
      
}
       else
       {
          
$highlight=highlight_string($code, true);
       }
      
      
# Using preg_replace will allow PHP 4 in on the fun
      
if ( $inline === true )
          
$highlight=preg_replace("/<code>/i","<code class=\"inline\">",$highlight);
       else
          
$highlight=preg_replace("/<code>/i","<code class=\"block\">",$highlight);           
      
       if (
$return === true )
       {
           return
$highlight;
       }
       else
       {
           echo
$highlight;
       }
   }
?>
zero
16-Jun-2005 06:55
In some cases, I found that it's useful to have highlight_string format <code>...</code> inline as part of a paragraph, and other times, as a block for demonstrating multiple lines of code. I made this function to help out.

<?php
  
function highlight_code($code, $inline=false, $return=false) // Pre php 4 support for capturing highlight
  
{
       (string)
$highlight = "";
       if (
version_compare(phpversion(), "4.2.0", "<") === 1 )
       {
          
ob_start(); // start output buffering to capture contents of highlight
          
highlight_string($code);
          
$highlight = ob_get_contents(); // capture output
          
ob_end_clean(); // clear buffer cleanly
      
}
       else
       {
          
$highlight=highlight_string($data, true);
       }
      
      
## The classes below need to correspond to a stylesheet!
      
if ( $inline === true )
        
$highlight=str_ireplace("<code>","<code class=\"inline\">",$highlight);
       else
        
$highlight=str_ireplace("<code>","<code class=\"block\">",$highlight);
          
      
       if (
$return === true )
       {
           return
$highlight;
       }
       else
       {
           echo
$highlight;
       }
   }
?>
Sam Wilson
15-Jun-2005 02:32
manithu at fahr-zur-hoelle dot org forgot only one thing:  to fix the break tags.  The addidtion of the following should do it.

<?php
$str
= str_replace("<br>", "<br />", $str);
?>
bpgordon at gmail dot com
14-Jun-2005 04:04
On dleavitt AT ucsc DOT edu's comment:

You might want to use md5($html_string) instead of "piggusmaloy" as a generally good programming practice. Just in case "piggusmaloy" is actually in $html_string.
dleavitt at ucsc dot edu
04-Jun-2005 05:37
This function does not seem to like <script> tags in HTML strings: if there are any close tags for scripts (whatever their language/type) the syntax highlighter will poop out. The workaround is simple though:
<?php
$html_string
= str_replace("script","piggusmaloy", $html_string);
$html_string = highlight_string($html_string, true);
$html_string = str_replace("piggusmaloy","script", $html_string);
echo
$html_string;
?>
This works best if you don't have "piggusmaloy" anywhere in your string (a safe assumption?)
trixsey at animania dot nu
30-May-2005 07:02
A neat function I made. Syntax coloring, row numbers, varying background colors per row in the table.

<?
function showCode($code) {
  
$html = highlight_string($code, true);
  
$html = str_replace("\n", "", $html);
  
$rows = explode("<br />", $html);

  
$row_num = array();
  
$i = 1;

   foreach(
$rows as $row) {
       if(
$i < 10) {
          
$i = "0".$i;
       }

       if(
$i==1) {
          
$row_num[] = "<tr><td><code><font color=\"#000000\"><code>$i</code></font>\t$row</code></td></tr>";
       }

       if(
$i!=1) {
           if(
is_int($i/2)) {
              
$row_num[] = "<tr bgcolor=\"#F9F9F9\"><td><code><font color=\"#000000\">$i</font>\t$row</code></td></tr>";
           } else {
              
$row_num[] = "<tr><td><code><font color=\"#000000\">$i</font>\t$row</code></td></tr>";
           }
       }

      
$i++;
   }
   return
"<pre>\nFilename: <b>$_GET[file]</b>\n<table
   style=\"border:1px #000000 solid\">"
.implode($row_num)."</table></pre>";
}
?>
support at superhp dot de
10-Apr-2005 07:58
With this function you can highlight php code with line numbers:

<?php
function highlight_php($string)
{
 
$Line = explode("\n",$string);

  for(
$i=1;$i<=count($Line);$i++)
  {
  
$line .= "&nbsp;".$i."&nbsp;<br>";
  }
  
 
ob_start();
 
highlight_string($string);
 
$Code=ob_get_contents();
 
ob_end_clean();
 
 
$header='<table border="0" cellpadding="0" cellspacing="0" width="95%" style="border-style: solid; border-width:1px; border-color: white black black white">
   <tr>
     <td width="100%" colspan="2"  style="border-style: solid; border-width:1px; border-color: white; background-color: #99ccff; font-family:Arial; color:white; font-weight:bold;">Php-Code:</td>
   </tr>
   <tr>
     <td width="3%" valign="top" style="background-color: #99ccff; border-style: solid; border-width:1px; border-color: white;"><code>'
.$line.'</code></td>
     <td width="97%" valign="top" style="background-color: white;"><div style="white-space: nowrap; overflow: auto;"><code>'
;

 
$footer=$Code.'</div></code></td>
   </tr>
  </table>'
;

  return
$header.$footer;
}
?>
admin [at] develogix [dot] com
17-Feb-2005 03:15
I've been working on a good replacement for the highlight_string() function; and here is what I've come up with so far:

<?
function get_sourcecode_string($str, $return = false, $counting = true, $first_line_num = '1', $font_color = '#666'){
  
$str = highlight_string($str, TRUE);
  
$replace = array(
      
'<font' => '<span',
      
'color="' => 'style="color: ',
      
'</font>' => '</span>',
      
'<code>' => '',
      
'</code>' => '',
      
'<span style="color: #FF8000">' =>
          
'<span style="color: '.$font_color.'">'
      
);
   foreach (
$replace as $html => $xhtml){
      
$str = str_replace($html, $xhtml, $str);
   }
  
// delete the first <span style="color:#000000;"> and the corresponding </span>
  
$str = substr($str, 30, -9);
              
  
$arr_html      = explode('<br />', $str);
  
$total_lines  = count($arr_html);   
  
$out          = '';
  
$line_counter  = 0;
  
$last_line_num = $first_line_num + $total_lines;
  
   foreach (
$arr_html as $line){
      
$line = str_replace(chr(13), '', $line);
      
$current_line = $first_line_num + $line_counter;
       if (
$counting){
          
$out .= '<span style="color:'.$font_color.'">'
                
. str_repeat('&nbsp;', strlen($last_line_num) - strlen($current_line))
                 .
$current_line
                
. ': </span>';
       }
      
$out .= $line
            
. '<br />'."\n";
      
$line_counter++;
   }
  
$out = '<code>'."\n".$out.'</code>."\n"';

   if (
$return){return $out;}
   else {echo
$out;}
}
?>

This function outputs valid XHTML 1.1 code by replacing font tags with span tags. You can also specify whether you want it to return or echo, output a line-count, the color of the line-count, and the starting line-count number.

Usage:
<?
// $str = string with php
// $return = true (return) / false (echo)
//    default of false
// $counting = true (count) / false (don't count)
//    default of true
// $start = starting count number
//    default of '1'
// $color = count color with preceding #
//    defalut of '#666'
get_sourcecode_string($str, $return$counting, $start, $color);
?>
gaggge at gmail dot com
31-Jan-2005 12:26
This is a little function for highlighting bbcode-stylish PHP code from a mysql database.
(Like this: [php]<?php echo "test"; ?>[/php])

<?php
function bbcode($s)
{
  
$s = str_replace("]\n", "]", $s);
  
$match = array('#\[php\](.*?)\[\/php\]#se');
  
$replace = array("'<div>'.highlight_string(stripslashes('$1'), true).'</div>'");
   return
preg_replace($match, $replace, $s);
}
?>
admin at bwongar dot com
06-Jan-2005 07:11
I didn't get the expected results from the other XHTML_highlight function, so I developed my own and it is much more efficient. The older one uses a preg_replace to replace the contents of the tag to within a span tag. The only preg_replace in my function pulls the color attribute, and puts it within a str_replace'd span tag.

<?php
function xhtml_highlight($str) {
  
$str = highlight_string($str, true);
  
$str = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $str);
   return
preg_replace('#color="(.*?)"#', 'style="color: \\1"', $str);
}

?>
manithu at fahr-zur-hoelle dot org
07-Nov-2004 03:10
This function will return highlighted, xhtml 1.1 valid code (replaces <font> with <span> elements and color with style attributes):

<?php

function xhtml_highlight($str) {
  
$str = highlight_string($str, true);
  
//replace <code><font color=""></font></code>
  
$str = preg_replace('#<font color="([^\']*)">([^\']*)</font>#', '<span style="color: \\1">\\2</span>', $str);
  
//replace other <font> elements
  
return preg_replace('#<font color="([^\']*)">([^\']*)</font>#U', '<span style="color: \\1">\\2</span>', $str);
}

?>
mastah_br at yahoo dot com
12-Oct-2004 11:31
If you're looking for a more generic syntax highlighter, then you should see GeSHi Project, at http://qbnz.com/highlighter/
aidan at php dot net
26-Sep-2004 11:29
To add line numbers to source code, with optional function linking, use the below function:

http://aidan.dotgeek.org/lib/?file=function.highlight_file_linenum.php

A much more thorough and smarter, though slower version is here:

http://aidan.dotgeek.org/lib/?file=PHP_Highlight.php