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;
//ただし、変数(先頭が$ドルマーク)は \でエスケープしないとだめです!
?>
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行目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行おきに色を変える プログラムソース/////<?phpfunction 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関数と上のしましまプログラムと合体技は開発されていません