構文ハイライト表示

PHPファイルの構文ハイライト表示について。

構文ハイライト表示とは?

PHPが利用可能な多くのウェブサーバでは、拡張子がphpsのファイルは自動的に構文ハイライト表示されるように(初期設定で)設定されています。例えばexample.phpsのようなファイルは、構文ハイライトしたソースファイルとして表示されます。

次の例は、foo.phpファイルをexample.phpファイルで構文ハイライト表示した際の例です。

foo.phpファイル
<?php phpinfo(); ?>
example.phpファイル
<?php highlight_file("foo.php") ?>

PHP 4 では、上の例の出力は以下のようになります。

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

また、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>

PHP 5 であれば、X/HTMLで非推奨のfont要素ではなくspan要素でソースがハイライト化されますが、code要素があるのだからspan要素を使うのはマークアップとして適切ではないと思います。

注釈

  • PHPのハイライタでは、改行は行区切りタグ(<br />)で出力します。

構文ハイライト表示クラス

クラスの作成経緯

本サイトでのPHPソースの公開に際して、拡張子が違えど中身が同じ2つのファイル(拡張子がphpphpsのファイル)を態々用意したくはありませんでした。そこで、Apacheの設定ファイル(.htaccess)に次のような記述を書いて試してみましたが駄目でした。

RewriteRule ^(.*)\.phps$ $1\.php [T=application/x-httpd-php-source, L]

そこで、highlight_file関数を使った簡素なソース表示用スクリプトを書いてみました。ただ、highlight_file及びhighlight_string関数(PHP組込みの構文ハイライタ)の出力は、X/HTMLとして好ましいものではありません。そこで、即席ですが構文ハイライト表示の為のクラスを作成しました。

HighlightSourceクラス

public class HighlightSource extends Object

構造

コンストラクタ

public void HighlightSource()
PHPファイルの構文ハイライト表示を行います。

メソッド

public Array getHighlight()
構文ハイライト表示モードの色の取得を行います。
返り値
構文ハイライト表示モードの色。
array( 'string' => string color,
       'comment' => string color,
       'keyword' => string color,
       'bg' => string color,
       'default' => string color,
       'html' => string color );
public void setHighlight(Array $highlight)
構文ハイライト表示モードの色の設定を行います。
引数
Array $highlight
構文ハイライト表示モードの色を配列で指定する。
$highlight = array( 'string' => string color,
                    'comment' => string color,
                    'keyword' => string color,
                    'bg' => string color,
                    'default' => string color,
                    'html' => string color );
public void restoreHighlight()
構文ハイライト表示モードの色の設定を元に戻します。
public String dump(String $filename)
構文ハイライトします。
引数
String $filename
ファイルのパス。
返り値
成功時に構文ハイライトしたHTMLコードを、失敗時には FALSE を返します。

HighlightSourceStrictクラス

public class HighlightSourceStrict extends HighlightSource

構造

コンストラクタ

public void HighlightSourceStrict()
PHPファイルの構文ハイライト表示(Strict版)を行います。

プロパティ

public Integer $parseType
PHP5用のみ。構文ハイライト表示をstrictな構文に置換する際の処理方法を設定します。0 なら正規表現検索(デフォルト)、1 ならXMLパーサを使用します。

メソッド

HighlightSourceクラスをご覧下さい。

クラスの使用例

次の例は、HighlightSourceクラスを使用したサンプルです。

<?php
ini_set("include_path", "./");
// require_once("org/purl/net/osamurai/misc/HighlightSource.php"); // for PHP 4
require_once("misc/HighlightSource.php"); // for PHP 5

$phps = new HighlightSource;
$filename = 'foo.php';
$highlight = array('string' => "#DD0000", 'comment' => "#FF8000", 'keyword' => "#007700",
                   'bg' => "#FFFFFF", 'default' => "#0000BB", 'html' => "#000000");
$phps->setHighlight($highlight);
echo $phps->dump($filename);

unset($phps);
?>

上の例の出力は、highlight_file関数を使用した時と同じ結果を返します。この際、setHighlightメソッドで設定した色が表示色として反映されます。このHighlightSourceクラスを厳密なHTMLを返すように拡張したクラスがHighlightSourceStrictクラスです。

次の例は、HighlightSourceStrictクラスを使用したサンプルです。

<?php
ini_set("include_path", "./");
// require_once("org/purl/net/osamurai/misc/HighlightSourceStrict.php"); // for PHP 4
require_once("misc/HighlightSourceStrict.php"); // for PHP 5

$phps = new HighlightSourceStrict;
$filename = 'foo.php';
$highlight = array('string' => "#DD0000", 'comment' => "#FF8000", 'keyword' => "#007700",
                   'bg' => "#FFFFFF", 'default' => "#0000BB", 'html' => "#000000");
$phps->setHighlight($highlight);
echo $phps->dump($filename);

unset($phps);
?>

上の例の出力は、次のようになります。

<pre class="php-highlight"><code class="html"><code class="default">&lt;?php phpinfo</code><code class="keyword">();</code> <code class="default">?&gt;</code></code></pre>

注釈

  • HighlightSourceStrictクラスを使用する場合には、色設定は外部スタイルシートで行います。
  • 構文ハイライト表示するソースコードに改行・空白などの制御文字が含まれる場合、PHPのhighlight_file関数では、制御文字の直前のコードの要素に包括します。これをHighlightSourceStrictクラスのdumpメソッドでは、直前のコードの要素に包括せず、尚且つbrタグを使わずに厳密なマークアップで表示できます。
  • HighlightSourceStrictクラスが返す結果は、XHTML 1.0/1.1 のDTDでも定義されている要素を使用していますが、最上位要素(pre要素)に名前空間を示さないので、XML/XHTMLでご利用の際にはそのことに注意して下さい。
  • ご利用の際の注意事項などもご覧下さい。

PHPソースビューア

概要

構文ハイライト表示クラスを使用した、PHPファイルのソースコードを表示する為のスクリプトです。本サイトでのPHPソースの公開にも使用しているスクリプトです。

ファイル一覧

PHP 4
PHP 5

注釈

  • ご利用の際には、define.default.phpdefine.phpとファイル名を変更してからご利用ください。
  • View.php, define.phpファイルは、任意のディレクトリに格納して下さい。
  • ご利用の際の注意事項などもご覧下さい。

設定

必要であれば、設定ファイル(define.php)で動作設定が行えます。設定ファイルをテキストエディッタで開き、コメント記述を参考にしながら編集して下さい。

使用方法

変換対象となるファイルのパスをView.phpのクエリーpathに指定して使用します。クエリーpathに指定する変換対象のファイルのパスは、設定ファイルの変数$ROOT_DIRで指定されたディレクトリを起点としたパスを指定します。

http://www.example.com/psv/view.php?path=/foo.php

サーバソフトウェアがApacheで、尚且つmod_rewriteモジュールが使用可能ならば、.htaccessファイルに次のような記述をすることで、拡張子がphpsのパスで要求された際にView.phpでソースを表示することができます(下記例では、phpsファイルがある場合には、それを使います)。

RewriteEngine on
# 基となる名前に名前をrewriteして、php拡張子で存在確認する。
# もし存在すれば、その名前を取り、そうでなければオリジナルの状態(phps)のURLにrewriteする。
RewriteRule ^(.*)\.phps$ $1 [C,E=WasPHPS:yes]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /php/psv/View.php?path=%{REQUEST_FILENAME}.php [S=1]
RewriteCond %{ENV:WasPHPS} ^yes$
RewriteRule ^(.*)$ $1.phps [L]