highlight_string関数でPHPプログラムソースを色分けする

HPやブログにプログラムソースをのせる場合
できるだけきれいに載せたいですよね?

PHPには、highlight_string()関数highlight_file()関数という
自動的に色分けしてくれる便利な関数が最初からあります

highlight_string()関数の主な使い方は、
highlight_string('<?php phpinfo(); ?>'); ←のように引数に文字列や変数を入れます

highlight_file()関数は、引数にファイル名を入れます
highlight_file('phptest.php'); ←のようにするとファイルごと色分けして表示します

下記のように変数をヒアドキュメントにしておいて、highlight_string()関数で呼び出すとやりやすいかな?

<?php $irowake=<<<EOT <?php \$iro = 'highlight_string関数を使うと'; \$iro2 = "自動的に色分けしてくれます"; ソースをHPなどで載せる場合 <br />タグや<table>タグも自動的に エスケープしてくれるので便利です echo \$iro.\$iro2; //ただし、変数(先頭が\$ドルマーク)は \\でエスケープしないとだめです! ?> EOT; highlight_string($irowake); ?>

$str=<<<'EOT'のように
EOTの部分をシングルクウォートで囲むと ヒアドキュメントの中で変数が展開しません!!(PHP5.3から)

実行結果
<?php
$iro 
'highlight_string関数を使うと';
$iro2 "自動的に色分けしてくれます";

ソースをHPなどで載せる場合 <br />タグや<table>タグも自動的に
エスケープしてくれるので便利です
<br />
echo 
$iro.$iro2;
//ただし、変数(先頭が$ドルマーク)は \でエスケープしないとだめです!
?>

highlight_string()関数で自分好みの色に変えてみる

hilight_string()関数は、php.iniを書き換えることによって色を変化させることができます
とはいえサーバのphp.iniをいちいちテキストエディタで編集するのも面倒なので
ini_set()関数で文字色を変えます 具体的には下記のようになります


スタイルシートはdiv(角丸、ドロップシャドウ、IE非対応)のCSSです

<style>
.maru1 {
    background:#000;
    text-align:left; 
    color:#FFF;
    margin-left:40px;
    margin-right:40px;
    padding :10px;
    moz-border-radius:15px;
    -webkit-border-radius:15px;
    border-radius:15px;
    box-shadow: 8px 8px 8px rgba(0,0,0,0.4); 
    overflow:auto;
}
</style>
<?php
ini_set
("highlight.string","#FFC375");//シングルダブルコーテーションの中の色
ini_set("highlight.comment","#7D7D7D");//コメントの色     
ini_set("highlight.keyword","#FFFF33");//関数やドット,カンマ,セミコロンなど     
ini_set("highlight.bg","#000000");//おそらくバックグラウンドの色(PHP5.4で廃止らしい)
ini_set("highlight.default","#99C5FF");//色分け以外の色
ini_set("highlight.html","#FFFFFF");//PHP以外の色?
echo '<div class="maru1">';
echo 
'<code><pre>';
highlight_string($irowake2);
echo 
'</pre><code>';
echo 
'</div>';
?>

1行おきに背景色を変えるプログラムソース
1行目
2行目 //インデント
3行目
4行目

Notice: Undefined offset: 4 in /home/member/sitemix_55218/site/simasima2.php on line 186

プログラムソースをきれいにみせるには
色分けのほかに1行ごとに色を変えるのも効果的です

これは関数では、できないのでプログラムでやります

/////スタイルの定義(本来は外部から呼び出す)/////
<style type="text/css">
.line_text{
text-align:left;
padding-left:10px;
padding-right:8px;
background:#BDDED1;
}
.line_text2{
text-align:left;
padding-left: 10px;
padding-right:8px;
background:#A5CFF5;
}
.simasima_kakomi{
border:1px solid gray;
margin : 12px;
}
</style>
//////////スタイル定義終り//////////
/////1行おきに色を変える プログラムソース/////
<?php
function simasima($code){
if (!is_array($code)) $codeE = explode("\n", $code);
$lines = count($codeE);
$cnt = 0;
echo "<pre>";
echo '<div class="simasima_kakomi">';
for($i=0;$i<=$lines;$i++){
if($cnt==0) {
echo '<div class="line_text">';
echo htmlspecialchars($codeE[$i],ENT_QUOTES);
echo "</div>";
$cnt=1;
}elseif($cnt==1) {
echo '<div class="line_text2">';
echo htmlspecialchars($codeE[$i],ENT_QUOTES);
echo "</div>";
$cnt=0;
}
}
echo "</div>";
echo "</pre>";
}
?>

Notice: Undefined offset: 47 in /home/member/sitemix_55218/site/simasima2.php on line 226

1行ごとに背景色が変化する PHPプログラムの解説

最初にexplode関数を使用し "\n" (改行コード)で1行づつ分割しています
次にcount関数で行数をカウントして
あとはfor文でカウントした行数分 1行ごとに背景色を変える処理をしています


このプログラムの使い方と注意点
1行ごとにスタイルシートの背景色を変化させています
スタイルシートをいじるだけで
背景色だけでなく、文字の大きさや色,行間なども調整できます

使い方はいたって簡単
文字列をシングルクウォートで囲む

simasima('1行目
2行目
3行目');

のようにするか


表示したい文字列を変数に代入しておいて(ヒアドキュメントなどが楽)

simasima(変数);
と書くだけです


使用例1(直接文字列を入れるパターン)【非推薦】
<?php 
simasima('このような形で文字列を入れると
一行ごとに
<div>の背景色が変化します

文字列はシングルクウォートで囲んでください

この方法は文字列内で さらに \' があると
エスケープ処理をしないといけないので
この方法を 非推薦とします');
?>

実行結果
このような形で文字列を入れると
一行ごとに
<div>の背景色が変化します
文字列はシングルクウォートで囲んでください
この方法は文字列内で さらに ' があると
エスケープ処理をしないといけないので
この方法を 非推薦とします

Notice: Undefined offset: 9 in /home/member/sitemix_55218/site/simasima2.php on line 226

使用例2(一度、変数に格納してから表示する)【推薦】

上の方法だと文字列内にシングルクウォートがある場合厄介なので
こちらの方法で使用するのがよいです

<?php
$mojiretu=<<<EOT
変数に格納してから表示するパターンです

PHPのヒアドキュメントを使用しています
はじめのEOTの部分を'EOT'とシングルクウォートで囲むと
ヒアドキュメント内の変数が展開されません(NowDoc)
終りのEOT;はシングルクウォートは つけてはいけません

(NowDocはPHP5.3以上でないと使用できません)


ヒアドキュメント内で\$【ドルマーク】を使用する場合は
\$マークを"\\$"としてエスケープしてください
EOT;
simasima($mojiretu);
?>

実行結果
変数に格納してから表示するパターンです
PHPのヒアドキュメントを使用しています
はじめのEOTの部分を'EOT'とシングルクウォートで囲むと
ヒアドキュメント内の変数が展開されません(NowDoc)
終りのEOT;はシングルクウォートは つけてはいけません
(NowDocはPHP5.3以上でないと使用できません)
ヒアドキュメント内で$【ドルマーク】を使用する場合は
$マークを"\$"としエスケープしてください

Notice: Undefined offset: 11 in /home/member/sitemix_55218/site/simasima2.php on line 226
このプログラムの注意点

\n(改行コード)を取得して次の<div>に移行するので
表示したいプログラムソースに"\n"が混じっていると"\\n"と記述しエスケープ処理します

改行コードがLFの場合まれにうまく表示できないことがあるため
そういう場合は改行コードをCRLFで保存するとうまくいくことがあります

またHTMLのタグ機能も htmlspecialchars関数でうばっているので
特定の文字だけ色を変えたいなどのことは できません

現在のところhighlight_string関数と上のしましまプログラムと合体技は開発されていません