PHP Doku:: Syntax-Hervorhebung für eine Datei - function.highlight-file.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzSonstige GrunderweiterungenMiscellaneous FunctionsSonstige Funktionenhighlight_file

Ein Service von Reinhard Neidl - Webprogrammierung.

Sonstige Funktionen

<<__halt_compiler

highlight_string>>

highlight_file

(PHP 4, PHP 5)

highlight_fileSyntax-Hervorhebung für eine Datei

Beschreibung

mixed highlight_file ( string $filename [, bool $return = false ] )

Erzeugt die hervorgehobene Syntax des Codes der Datei filename als Ausgabe oder als Rückgabewert. Dabei werden die Farben des in PHP eingebauten Syntax-Highlighters benutzt.

Viele Server sind so konfiguriert, dass sie den Code von Dateien mit der phps-Erweiterung automatisch hervorheben. Wenn zum Beispiel beispiel.phps aufgerufen wird, wird die hervorgehobene Syntax des Quellcodes der Datei angezeigt. Mit der folgenden Zeile in der httpd.conf wird dies aktiviert:

AddType application/x-httpd-php-source .phps

Parameter-Liste

Dateiname

Der Pfad zur PHP-Datei, deren Code hervorgehoben werden soll.

return

Wenn dieser Parameter auf TRUE gesetzt wird, gibt die Funktion den hervorgehobenen Code zurück.

Rückgabewerte

Falls return auf TRUE gesetzt ist, wird der hervorgehobene Code nicht direkt ausgegeben, sondern als Zeichenkette zurückgegeben. Andernfalls wird bei Erfolg TRUE zurückgegeben und FALSE, falls ein Fehler auftritt.

Changelog

Version Beschreibung
4.2.1 Diese Funktion wird nun ebenfalls von safe_mode und open_basedir beeinflusst.
4.2.0 Der Parameter return wurde hinzugefügt.

Anmerkungen

Achtung

Wenn highlight_file() verwendet wird, sollte darauf geachtet werden, dass nicht versehentlich vertrauliche Informationen wie zum Beispiel Passwörter oder andere Informationen, die ein potentielles Sicherheitsrisiko schaffen könnten, verraten werden.

Hinweis:

Diese Funktion benutzt intern Ausgabenpufferung mit diesem Parameter und kann daher nicht in einer ob_start()-Callbackfunktion eingesetzt werden.

Siehe auch


26 BenutzerBeiträge:
- Beiträge aktualisieren...
design at joelalejandro dot com dot ar
1.09.2009 1:52
Just my two cents - a function that takes PHP source code from a file and decodes it to text/plain MIME-type.

Cheers,
Joel A. Villarreal Bertoldi

<?php
function phps2array($fileName)
{
    return
explode("\r", html_entity_decode(strip_tags(highlight_file($fileName, true))));
}
?>

Example:
####################################

samplefile.php:
<?php
$a
= 1;

/* This is my file*/
echo $a;
?>

parser.php:
<?php
header
("Content-Type: text/plain");
print_r(parse_php_file("samplefile.php"));
?>

####################################
Results:
####################################

Array
(
    [0] => <?php
   
[1] => $a = 1;
    [
2] =>
    [
3] => /* This is my file*/
   
[4] => echo $a;
    [
5] => ?>
)

####################################
Miki Roro
31.08.2009 17:39
highlight_file() wraps HTML tags around PHP constructions,
so it's not useful for CLI. If you want to have highlighted source
in command line, use this script:

<?php
$php
= $argv[1]; // set a path
if(!$php)
 
$php = $argv[0];

$c_string = ini_get('highligth.string'); // get ini values
$c_comment = ini_get('highlight.comment');
$c_keyword = ini_get('highlight.keyword');
$c_default = ini_get('highlight.default');
$c_html = ini_get('highlight.html');

$source = highlight_file($php, true); // load highlighted source

$source = str_replace('</span>', '', $source); // replace html tags
$source = str_replace('<span style="color: #DD0000">', '', $source);
$source = str_replace('<span style="color: '.$c_comment.'">', '', $source);
$source = str_replace('<span style="color: '.$c_keyword.'">', '', $source);
$source = str_replace('<span style="color: '.$c_default.'">', '', $source);
$source = str_replace('<span style="color: '.$c_html.'">', '', $source);

$source = str_replace('<code>', '', $source); // strip <code> and <br>
$source = str_replace('</code>', '', $source);
$source = str_replace('<br />', "\n", $source);
$source = str_replace('&nbsp;', ' ', $source); // remove &nbsp and entities
$source = html_entity_decode($source);

echo
$source;
?>

Then type `php highlight.php some_other_script.php` to have
colorful source in terminal window. Tested under Ubuntu.
dynamicflurry [at] gmail dot com
4.08.2009 16:33
Here's a great function I found to add numbers to your highlighted code:

<?php
function highlight_num($file)
{
 
$lines = implode(range(1, count(file($file))), '<br />');
 
$content = highlight_file($file, true);

 
  echo
'
    <style type="text/css">
        .num {
        float: left;
        color: gray;
        font-size: 13px;   
        font-family: monospace;
        text-align: right;
        margin-right: 6pt;
        padding-right: 6pt;
        border-right: 1px solid gray;}

        body {margin: 0px; margin-left: 5px;}
        td {vertical-align: top;}
        code {white-space: nowrap;}
    </style>'
;
   
   
   
    echo
"<table><tr><td class=\"num\">\n$lines\n</td><td>\n$content\n</td></tr></table>";
}
highlight_num(__FILE__);
?>
afugit at imavex dot com
24.07.2009 17:42
This function will not only echo out the code but will add line numbers.  The extra code is for the multi-line and single-line comments using /* and */ and making sure they are highlighted appropriately.  If not used, the multi-line comments will not be displayed in orange (or the default comment color).

Anthony

=============

<?php
  
function renderFile($filename) {
        if(
file_exists($filename) && is_file($filename)) {
           
$code = highlight_file($filename, true);
           
$counter = 1;
           
$arr = explode('<br />', $code);
            echo
'<table border="0" cellpadding="0" cellspacing="0" width="100%" style="font-family: monospace;">' . "\r\n";
            foreach(
$arr as $line) {
                echo
'<tr>' . "\r\n";
                    echo
'<td width="65px" nowrap style="color: #666;">' . $counter . ':</td>' . "\r\n";

                   
// fix multi-line comment bug
                   
if((strstr($line, '<span style="color: #FF8000">/*') !== false) && (strstr($line, '*/') !== false)) { // single line comment using /* */
                       
$comments = false;
                       
$startcolor = "orange";
                    }  
                    elseif(
strstr($line, '<span style="color: #FF8000">/*') !== false) { // multi line comment using /* */
                       
$startcolor = "orange";
                       
$comments = true;
                    }  
                    else {
// no comment marks found
                       
$startcolor = "green";
                        if(
$comments) { // continuation of multi line comment
                           
if(strstr($line, '*/') !== false) {
                               
$comments = false;
                               
$startcolor = "orange";
                            }  
                            else {
                               
$comments = true;
                            }  
                        }  
                        else {
// normal line  
                           
$comments = false;
                           
$startcolor = "green";
                        }  
                    }  
                   
// end fix multi-line comment bug

                   
if($comments)
                        echo
'<td width="100%" nowrap style="color: orange;">' . $line . '</td>' . "\r\n";
                    else
                        echo
'<td width="100%" nowrap style="color: ' . $startcolor . ';">' . $line . '</td>' . "\r\n";

                    echo
'</tr>' . "\r\n";
                   
$counter++;
            }  
            echo
'</table>' . "\r\n";
        }  
        else {
            echo
"<p>The file <i>$filename</i> could not be opened.</p>\r\n";
            return;
        }  
    }
?>
nospam at mbeulens dot nl
12.07.2009 9:00
This is my try on linenumbers
<?php
   
public static function highlight_file_with_line_numbers($file) {
         
//Strip code and first span
       
$code = substr(highlight_file($file, true), 36, -15);
       
//Split lines
       
$lines = explode('<br />', $code);
       
//Count
       
$lineCount = count($lines);
       
//Calc pad length
       
$padLength = strlen($lineCount);
       
       
//Re-Print the code and span again
       
echo "<code><span style=\"color: #000000\">";
       
       
//Loop lines
       
foreach($lines as $i => $line) {
           
//Create line number
           
$lineNumber = str_pad($i + 1$padLength, '0', STR_PAD_LEFT);
           
//Print line
           
echo sprintf('<br><span style="color: #999999">%s | </span>%s', $lineNumber, $line);
        }
       
       
//Close span
       
echo "</span></code>";
    }

?>
Anonymous
11.04.2009 12:02
I get linenumbers this way... cause I don't like tables :p

<?php

function highlight_linenumbers ($page)
{

   
// remove <code> and global <span>
   
$code = highlight_file($page, true) ,36,-15);

    echo
'<ol style="font-family:monospace; color:', ini_get('highlight.{default}') , ';">';

   
$arr = explode('<br />', $code);
    foreach(
$arr as $line )
    {
       
// removing newline
       
$line = substr($line, 0, -1);

       
//empty lines
       
if( preg_match('`^(&nbsp;)*$`',$line) ) $line = '&nbsp;';

       
// add colour from the previous line
       
if( !empty($last_colour) ) $s = '<span style="color:'.$last_colour .'">'. $s;
       
       
// Supposing we open more spans on a line than closing... let's do this properly
        // We have at most one currently opened span
       
if( substr_count($line, '<span') - substr_count($line, '</span') > 0 )
        {
               
$line .= '</span>';

               
// Grab colour to report it on next line
               
$last_colour = explode('<span ',$line);
               
$last_colour = $last_colour[count($last_colour)-1];
           
               
$last_colour = substr($last_colour,strpos($last_colour,'#'),7);

                else
$last_colour = NULL;

                echo
'<li>',$line,"</li>\r";
        }

        echo
'</ol>';
}

?>
SneakyWho_am_i
10.09.2008 13:00
From W on 20 August 2008:
YES! I do it too, on many of my things! I love to be able to share my code (when I have the right to do it) with friends who aren't working on the project.

<?php

if (isset($_GET['code'])) { die(highlight_file(__FILE__, 1)); }

?>

I like to do it like this. The benefit is minimal but personally for such a small thing I would like to keep it down to one line. Maybe there is a shorter way, I don't know.. But the magic constant __FILE__ saves the day!

To access this one would be http://example.com/path/to/script.php?code
the parameter just has to be set (? or &) and you don't need the equals sign.
This way I don't generate any errors in E_ALL (because I'm likely in development), and I don't have to remember if the value was supposed to be "true" or "1" or "abacus" or whatever (I mean you're never going to specifically ask to NOT show the code, right?)

Anyway I've gone on long enough. It's nice to not be the only one who does this :D
W
20.08.2008 11:43
Normally I add highlighting for files like so:

In every file that should be higlighted:
<?php
$tool_file
=$_SERVER['SCRIPT_FILENAME']; $tool_file=basename($tool_file);
include_once(
'highlight.inc.php');
showCode();
?>

And in highlight.inc.php (or your init file):
<?php
function showCode() {
if (
$_REQUEST['codeShow'] == 1) {
       
highlight_file($codeName);
        exit ();
    }
}
?>

When a user will open the sourcecode (or you'll link to it) he just adds ?codeShow=1 to the filename.
mmcloughlin at gmail dot com
9.05.2008 15:06
You can trick this function to apply additional css rules to parts of the source code.

For example, if you wanted comments to appear in bold you could do the following

<?php
ini_set
('highlight.comment', '#CCCCCC; font-weight: bold;');
highlight_file('file.php');
?>

This works because when highlight_file() writes out a comment it wraps it in <span style="color: {contents of hightlight.comment ini variable}">...</span>. Therefore as long as your ini value for highlight.comment starts with a color, you can put in whatever style declarations you like.

This applies to all of the other relavent ini values: highlight.default, highlight.html, highlight.keyword, highlight.string.
comperr dot extra at gmail dot com
18.04.2008 20:20
Here is what I use
<?php

   
/* array() ensures that ok[] cannot have paths inserted if register globals is enabled */

   
$ok = array(
       
'f1.php',
       
'f2.php'
   
);

    if (!
in_array($_GET['f'], $ok))
    {
        die (
'Not allowed to view this page');
    }
    else
    {
       
highlight_file($_GET['f']);
    }
?>
moisadoru at gmail dot com
17.10.2007 14:24
A function which parses the output of highlight file and replaces &lt;span&gt; wits &lt;a&gt;, replaces the style="color: #XXXXXX" part with class="cX", storing the colors in some css rules; that way you get a smaller output size (ratio is about about 1.2 ~ 1.4):
<code>
<?php
function highlight_file2($fl,$ret){
    if(!isset(
$ret)) $ret = false;
   
$str = highlight_file($fl,true);
   
preg_match_all("/\<span style=\"color: #([\d|A|B|C|D|E|F]{6})\"\>.*?\<\/span\>/",$str,$mtch);
   
$m = array_unique($mtch[1]);

   
$cls = '<style type="text/css">'."\n";
   
$rpl = array("</a>");
   
$mtc = array("</span>");
   
$i = 0;
    foreach(
$m as $clr) {
       
$cls .= "a.c".$i."{color: #".$clr.";}\n";
       
$rpl[] = "<a class=\"c".$i++."\">";
       
$mtc[] = "<span style=\"color: #".$clr."\">";
    }
   
$cls .= "</style>";
   
$str2 = str_replace($mtc,$rpl,$str);
    if(
$ret) return $str2;
    else echo
$str2;
}
?>
</code>
thinbegin at unmannedship dot com
19.08.2007 7:45
i much prefer to use the .phps extension for showing highlighted source. all you have to do is type "cp example.php example.phps" at the command line.

on the flip side, for easy dynamic source sharing, it's as simple as:

<?php
if (!isset($_GET['file']) || trim($_GET['file']) == '') {
    echo
'please pass me something yummy';
    die(
0);
}

if (!
file_exists($_GET['file'])) {
    echo
"<b>{$_GET['file']}</b> does not seem to exist :(";
    die(
0);
}

highlight_file($_GET['file']);
?>
management at twilightus dot net
21.03.2007 3:18
Here's a better take at highlighting a file with line numbers:

<style type="text/css">
.num {
float: left;
color: gray;
text-align: right;
margin-right: 6pt;
padding-right: 6pt;
border-right: 1px solid gray;}
</style>
<?php
function highlight_num($file)
{
  echo
'<code class="num">', implode(range(1, count(file($file))), '<br />'), '</code>';
 
highlight_file($file);
}

highlight_num('file.php');
?>

Thanks for the implode() part from Arevos at programmingforums.org
jens dot grasnick at gmail dot com
7.10.2006 3:38
Hi there, i build a "little" class to controll the highlighting functions (highlight_source & highlight_file) of PHP a little bit more. You can:

- set the highlighting colors without rewrite your php.ini
-create a whitelist using by highlightFile - so your're surly that nobody take a look on your private source ;-)
- work with the highlighted content - it returns the highlighted content, not show it like highlight_file or highlight_source did.

Class:

<?php

class betterHighlighting {
 
/* user colors */
 
private $userColors = array(
     
"string"  => "",
     
"comment" => "",
     
"keyword" => "",
     
"bg"      => "",
     
"default" => "",
     
"html"    => "",
  );
 
 
/* array of allowed file for using by ::highlightFile() */
 
private $whitelist = array();
 
 
/* construct */
 
function __construct($allowedFiles = NULL, /* array or NULL */
                      
$newColors    = NULL  /* array or NULL */) {
                      
   
/* add (if some given) files to the highlighting whitelist */
   
if($allowedFiles) {
     
$this -> addFiles($allowedFiles);
    }
   
   
/* set highlighting colors */
   
if($newColors) {
     
$this -> setColors($newColors);
    }
  }
 
 
/* for adding files to the whitelist */
 
public function addFiles($allowedFiles /* array or string */) {
   
$file = is_array($allowedFiles) ? array_pop($allowedFiles) : $allowedFiles;
   
    if(
file_exists($file)) {
     
$this -> whitelist[] = $file;
    } else
   
    if(
is_array($allowedFiles) && sizeof($allowedFiles)) {
     
$this -> addFiles($allowedFiles);
    }
   
    return
void;
  }
 
 
/* for setting new userColors */
 
public function setColors($newColors = array()) {
    foreach(
$newColors as $key => $color) {
      if(
in_array($key, array_keys($this -> userColors))) {
       
$this -> userColors[$key] = $color;
      }
    }
  }
 
 
/* replaces default colors with users colors */
 
private function putColors($highlightedContent) {
   
$nHC = $highlightedContent;
   
$hTpl = "<span style=\"color: %s\">";
   
    foreach(
$this -> userColors as $key => $color) {
      if(!empty(
$color)) {
       
$nHC = str_replace(sprintf($hTpl, ini_get("highlight.{$key}")), sprintf($hTpl, $color), $nHC);
      }
    }
   
    return
$nHC;
  }

 
/* highlight's a string */
 
public function highlightString($string) {
   
$hC = "";
     
   
ob_start();
   
highlight_string($string);
   
$hC = ob_get_contents();
   
ob_end_clean();
   
    return
$this -> putColors($hC);
  }
 
 
/* highlight's a file */
 
public function highlightFile($file) {
    if(
in_array($file, $this -> whitelist)) {
      return
$this -> highlightString(join("", file($file)));
    }
   
    return
"";
  } 
}

?>

Usage:
$cl = new betterHighlighting([mixed files], [mixed colors]);

To put a file or a array of files to the whitelist, use (void)  ::addFiles(mixed files).

To set a new color for highlighting use (void) ::setColors(array("string" => ..., "comment" => ..., "keyword" => ..., "bg" => ..., "default" => ..., "html" => ...)).
You only have to give the keyword(s), which color you'll change. If you only want to change the color of the highlighted comments, call ::setColors(array("comment" => "newcolor")) and so on.

Highlighting String:
(string)::highlightString(string $source)

Highlighting File:
(string)::highlightFile(string $file)

Note: The two last function RETURNS the highlighted content, not shows it directly.

Little example: I want to highlight the file "test.php" and the comments should be pink.

<?php

$cl
= betterHighlighting("test.php", array("comment" => "pink"));

echo
$cl -> highlightFile("test.php");

?>

Have fun.
paul at cheddar dot vaughany dot com
21.08.2006 13:53
It's a basic idea but one maybe worth sharing.

<?php
switch($_GET['file']) {
    case
1:
       
highlight_file("file1.php");
        break;
    case
2:
       
highlight_file("file2.php");
        break;
    case
3:
       
highlight_file("file3.php");
        break;
    default:
       
header("Location: ".$_SERVER["PHP_SELF"]);
}
?>

Save the script as showfile.php and access it like this:

<a href="showfile.php?file=1">Click here to see file 1 source code</a>

The default case is for people editing the URL to try to access further files. Just don't add any files you don't want users to see, and maybe hard-code in large, random numbers or MD5 hashes.
showsource at gmail dot com
8.04.2006 2:18
Please, be aware of just using marlon at mbwp dot nl example to show the sourcecode
Do as told in this manual, "CAUTION", do some check on what code to highlight.
Simply just using $_GET["file"] is very bad.
marlon at mbwp dot nl
5.03.2006 14:06
I use the folowing code to highlight a file with line numbers:

<?php
echo "<table bgcolor=#EEEEEE><tr><td width=30>";
for (
$i = 1; $i <= count(file($_GET['file'])); $i++) echo $i.".<br>";
echo
"</td><td>";
highlight_file($_GET['file']);
echo
"</td></tr></table>";
?>
msn at toolskyn dot nl
26.02.2006 10:18
I use this (simple and dirty) function in my tutorials to add linenumbers. I let all the linenumbers in one table cell so it is easier for people to copy and paste the code (so they don't have to remove all the linenumbers):

<?php
function highlight_with_linenum($file)
{
   
//open handle, set vars
   
$handle = fopen($file, "r");
   
$count = 1;
   
$lines = "";

   
//look line ends
   
while ($thisone = fread($handle, "1"))
    {
        if (
$thisone == "\n")
        {
           
//add number
           
$lines .= $count . "<br />";
           
$count++;
        }
    }   
   
//close handle
   
fclose($handle);

   
//highlight contents
   
$contents = highlight_file($file, TRUE);
       
   
//print output (you could as well return now)
   
print '<table><tr><td><code>' .
         
$lines . '</code></td><td>' .
         
$contents . '</td></tr></table>';   
}
?>

Maybe it's of use to someone
ganchev at design dot bg
13.01.2006 9:40
here's a simple way to add line numbers and
optionally highlight the one that has error on it.
just pass file and line arguments as GET variables

<?php

$f
= fopen($_GET['file'], "r");
$count = 1;
$line = "";
echo
"<table>";
while (
$c = fread($f, "1")) {
 
$line .= $c;
  if (
$c == "\n") {
    echo
"<tr style='background: " . (($_GET['line'] == $count) ? "#eedddd" : "#ffffff") . "'><td width='10%'>$count.</td><td>" . highlight_string($line, TRUE) . "</td></tr>\n";
   
$line = "";
   
$count++;
  }
}
echo
"</table>";
fclose($f);

?>
dtroi50 at gmail dot com
9.01.2006 23:39
If you run a site that has PHP script examples and you want to show the source, instead of a phps file, just add the following code to the top of the script.

<?php
if(count($_GET)) {
highlight_file(__FILE__);
}
?>

Then to make a source link use this:

<?php
print'<a href="?source">Show source</a>';
?>

Note that you don't have to use souce. If any get variables are set, it'll work.

-Tom
venski at gmail dot com
6.01.2006 14:21
I think it will be better if the variable contains the files that are allowed to be viewed. There can always befound a way to pass the name of a forbiddedn file that is not in the prohibited array.

Thus the code will be:

<?php
//array with files to allow
$allowed = array('index.php', 'menu.php', 'about.php');

// get the filename
$file = $_GET[file];
if(
file_Exists($file)){
    if(
in_array($file, $allowed)){
       
// check if it is part of the allowed list
       
highlight_file($file); //highlight file
   
}
    else{
       
// not allowed. just die. do not warn ;)
       
die("");
    }
}
else{
   
// file doesnt exist
   
echo "The file does not exist.";      
}
?>
trukin at gmail dot com
9.12.2005 4:46
this function can be a high security risk. use something like in_array to check if a file is prohibited to be shown on screen.

<?
$ar
= array('config.php', 'index.php', 'functions.php');    //array with files to denie
$file = $_GET[file];                    // iniziate the variable
if(file_Exists($file)){
    if(!
in_array($file, $ar)){    // check if it is prohibited
       
highlight_file($file); //highlight file
   
}else{     // prohibited file
       
echo "You do not have permision to see the ".$file." file.";
    }
}else{   
// file doesnt exist
   
echo "That file does not exist.";       
}
?>
Michael Newton (http://mike.eire.ca/)
6.12.2005 18:48
To print out the current file:

<?php highlight_file( __FILE__ ); ?>

Useful to add this as a header to all scripts (during development only, of course!)

<?php
if ($_GET['debug']) {
   
highlight_file( __FILE__ );
    exit;
}
?>
Vlad Alexa Mancini valexa at nextcode dot org
21.02.2005 20:19
Here is a small bash script that you can type at the console to make recursive symbolic .phps links for all your .php files starting at your curent directory

for f in `find -name '*.php'`; do ln -s `basename $f` $f's'; done

NOTE: You doubtedly want to do this at / as it will make such symlinks for all the php files on your filesystem

NOTE: This places the symlinks in the same directory as the php file that they are simlinking

And a simpler one that is not recursive and does the same thing but only for the php files in your current directory

for f in *.php; do ln -s $f $f's'; done
aidan at php dot net
26.09.2004 17:29
To add line numbers to source code, with optional function linking, use the below function:

http://aidanlister.com/repos/v/function.highlight_file_linenum.php

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

http://aidanlister.com/repos/v/PHP_Highlight.php
csst0266 at cs dot uoi dot gr
13.08.2004 18:42
Here is a simple, yet useful, tip... Issuing the following command under a Unix-like OS:

ln -s your_script.php your_script.phps

Will result in the creation of a symbolic link (called your_script.phps) to the source code (your_script.php). This way you have (apart from the source code .php) the highlighted version of your script (.phps) accessible via your web browser.



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)