web-dev-qa-db-ja.com

PHP構文の強調表示

カスタマイズ可能なPHP構文強調表示エンジンを検索しています(つまり、独自のトークナイザーを提供できます新しい言語の場合)および複数の言語を処理できます同時に(つまり、同じ出力ページ上)。このエンジンは、CSSクラスと連携して機能する必要があります。つまり、class属性で修飾された<span>要素を挿入して、出力をフォーマットする必要があります。拡張可能なスキーマのボーナスポイント。

私はnotクライアント側の構文強調スクリプト(JavaScript)を検索します。

これまでのところ、私は GeSHi で立ち往生しています。残念ながら、GeSHiはいくつかの理由で失敗します。主な理由は、異なる言語ファイルが完全に異なる、一貫性のないスタイルを定義しているためです。さまざまな言語の定義を共通の分母にリファクタリングしようと何時間も働いてきましたが、ほとんどの定義ファイルはそれ自体がかなり悪いので、ようやく切り替えたいと思います。

理想的には、 CodeRayPygments またはJavaScript dp.SyntaxHighlighter に類似したAPIが欲しいです。

明確化:

for PHPではなく、in PHPで記述されたコード強調表示ソフトウェアを探しています(PHP内から使用する必要があるため)。

39
Konrad Rudolph

既存のツールは私のニーズを満たしていなかったので、自分で作成しました。見よ:

ハイパーライト

使い方は非常に簡単です。

 <?php hyperlight($code, 'php'); ?>

コードを強調表示します。新しい言語定義の記述も比較的簡単です。正規表現と強力だが単純な状態機械を使用することです。ちなみに、私はまだたくさんの定義が必要なので、気軽に貢献してください。

48
Konrad Rudolph

[具体的にはコミュニティWikiとマークしました。あなたがJavaScriptを探しているわけではないではないためです]

http://softwaremaniacs.org/soft/highlight/is a PHP( およびサポートされる他の言語の次のリスト)構文強調表示ライブラリ:

Python、Ruby、Perl、PHP、XML、HTML、CSS、Django、Javascript、VBScript、Delphi、Java、C++、C#、LISP、RenderMan(RSLおよびRIB)、Maya組み込み言語、SQL、 Smalltalk、Axapta、1C、Ini、Diff、DOS .bat、Bash

<span class = "keyword">スタイルのマークアップを使用します。

dojo toolkit にも統合されています(dojoxプロジェクトとして: dojox.lang.highlight

ウェブサーバーを実行する最も一般的な方法ではありませんが、厳密に言えば、JavaScriptはクライアント側に実装されているだけでなく、 サーバー側のJavaScriptエンジン/プラットフォームの組み合わせも もあります。

10
micahwittman

PHP here )で記述されたこの単純な汎用構文ハイライターを見つけて、少し変更しました:

<?php

/**
 * Original => http://phoboslab.org/log/2007/08/generic-syntax-highlighting-with-regular-expressions
 * Usage => `echo SyntaxHighlight::process('source code here');`
 */

class SyntaxHighlight {
    public static function process($s) {
        $s = htmlspecialchars($s);

        // Workaround for escaped backslashes
        $s = str_replace('\\\\','\\\\<e>', $s); 

        $regexp = array(

            // Comments/Strings
            '/(
                \/\*.*?\*\/|
                \/\/.*?\n|
                \#.[^a-fA-F0-9]+?\n|
                \&lt;\!\-\-[\s\S]+\-\-\&gt;|
                (?<!\\\)&quot;.*?(?<!\\\)&quot;|
                (?<!\\\)\'(.*?)(?<!\\\)\'
            )/isex' 
            => 'self::replaceId($tokens,\'$1\')',

            // Punctuations
            '/([\-\!\%\^\*\(\)\+\|\~\=\`\{\}\[\]\:\"\'<>\?\,\.\/]+)/'
            => '<span class="P">$1</span>',

            // Numbers (also look for Hex)
            '/(?<!\w)(
                (0x|\#)[\da-f]+|
                \d+|
                \d+(px|em|cm|mm|rem|s|\%)
            )(?!\w)/ix'
            => '<span class="N">$1</span>',

            // Make the bold assumption that an
            // all uppercase Word has a special meaning
            '/(?<!\w|>|\#)(
                [A-Z_0-9]{2,}
            )(?!\w)/x'
            => '<span class="D">$1</span>',

            // Keywords
            '/(?<!\w|\$|\%|\@|>)(
                and|or|xor|for|do|while|foreach|as|return|die|exit|if|then|else|
                elseif|new|delete|try|throw|catch|finally|class|function|string|
                array|object|resource|var|bool|boolean|int|integer|float|double|
                real|string|array|global|const|static|public|private|protected|
                published|extends|switch|true|false|null|void|this|self|struct|
                char|signed|unsigned|short|long
            )(?!\w|=")/ix'
            => '<span class="K">$1</span>',

            // PHP/Perl-Style Vars: $var, %var, @var
            '/(?<!\w)(
                (\$|\%|\@)(\-&gt;|\w)+
            )(?!\w)/ix'
            => '<span class="V">$1</span>'

        );

        $tokens = array(); // This array will be filled from the regexp-callback

        $s = preg_replace(array_keys($regexp), array_values($regexp), $s);

        // Paste the comments and strings back in again
        $s = str_replace(array_keys($tokens), array_values($tokens), $s);

        // Delete the "Escaped Backslash Workaround Token" (TM)
        // and replace tabs with four spaces.
        $s = str_replace(array('<e>', "\t"), array('', '    '), $s);

        return '<pre><code>' . $s . '</code></pre>';
    }

    // Regexp-Callback to replace every comment or string with a uniqid and save
    // the matched text in an array
    // This way, strings and comments will be stripped out and wont be processed
    // by the other expressions searching for keywords etc.
    private static function replaceId(&$a, $match) {
        $id = "##r" . uniqid() . "##";

        // String or Comment?
        if(substr($match, 0, 2) == '//' || substr($match, 0, 2) == '/*' || substr($match, 0, 2) == '##' || substr($match, 0, 7) == '&lt;!--') {
            $a[$id] = '<span class="C">' . $match . '</span>';
        } else {
            $a[$id] = '<span class="S">' . $match . '</span>';
        }
        return $id;
    }
}

?>

デモ:http://phpfiddle.org/lite/code/1sf-htn


更新

PHP自分のJavaScript汎用構文ハイライターのポートをここに作成しました→ https://github.com/tovic/generic-syntax-highlighter/blob/master/generic- syntax-highlighter.php

使い方:

<?php require 'generic-syntax-highlighter.php'; ?>
<pre><code><?php echo SH('&lt;div class="foo"&gt;&lt;/div&gt;'); ?></code></pre>
9

ご覧になる価値があるかもしれません Pear_TextHighlighterdocumentation

私はデフォルトではあなたが望むように正確に出力htmlしないと思いますが、それはカスタマイズのための広範な機能を提供します(つまり、異なるレンダラー/パーサーを作成できます)

3
Tom Haigh

私はまったく同じ問題を抱えていましたが、時間は非常に短く、非常に優れたコードカバレッジが必要だったので、PHPのラッパー Pygments ライブラリを記述することにしました。

PHPygmentizator と呼ばれます。使い方はとても簡単です。私は非常に基本的な manual を書きました。 PHPは主にWeb開発言語であるため、構造をその事実に従属させ、ほとんどすべての種類のWebサイトでの実装を非常に簡単にしました。

それは 構成ファイル をサポートし、それが十分ではなく、誰かがプロセスで何かを変更する必要がある場合、それは イベント も起動します。

それがどのように機能するかのデモは、基本的に、ソースコードを含む私のブログの投稿 これは、たとえば にあります。

デフォルトの設定を使用すると、次の形式で文字列を提供できます。

Any text here.

[pygments=javascript]
var a = function(ar1, ar2) {
    return null;
}
[/pygments]

Any text.

したがって、タグ間のコードが強調表示され(タグは構成ファイルでカスタマイズできます)、残りの部分は変更されません。

さらに、私はすでに構文認識libraryを作成しました(これはおそらく ベイジアン確率 として分類されるアルゴリズムを使用します)。これは、どの言語コードブロックが記述されているかを自動的に認識します。 PHPygmentizatorイベントの1つに簡単にフックして、自動言語認識を提供できます。構造を少し美しくし、基本的なドキュメントを書く必要があるので、今週中に公開するでしょう。言語を驚くほどよく認識する十分な「学習」データを提供すると、類似したキーワードと構造を持つ縮小されたJavaScriptと言語でさえテストしましたが、間違いはありませんでした。

2
user2742648

PHPの組み込み構文ハイライターを使用しないのはなぜですか?

http://php.net/manual/en/function.highlight-string.php

1
Gabor de Mooij

ここで少し遅れましたが、私は自分のPHP構文強調表示ライブラリに取り組んでいます。それはまだ初期段階ですが、私のすべてのコードサンプルに使用していますブログ。

Hyperlightをチェックアウトしました。かなりクールに見えますが、かなりクレイジーなことをしています。入れ子のループ、行ごとの処理など。コアクラスは1000行を超えるコードです。

シンプルで軽量なものに興味がある場合は、虹路堂を​​チェックしてください。 http://www.craigiam.com/nijikodo

1
Craig

PHP Prettify これまでのところ正常に動作し、さらに highlight_string よりもカスタマイズされています

1
Ghostff

もう1つのオプションは、ほとんどのプラットフォームで利用できるAndre SimonによるGPLHighlight GUIプログラムを使用することです。 PHP(およびその他の言語))をHTML、RTF、XMLなどに変換し、必要なページに切り取って貼り付けることができます。これにより、処理は1回だけ行われます。

HTMLもCSSベースなので、自由にスタイルを変更できます。

個人的にはdp.SyntaxHighlighterを使用していますが、クライアント側のJavaScriptを使用しているため、ニーズを満たしていません。それは私が便利であると思うけれども素晴らしいWindows Liveプラグインを持っています。

1
Rob Prouse

Krijn Hoetmerの PHPハイライター は、完全にカスタマイズ可能なPHPハイライトするクラスPHP構文です。生成するHTMLは、厳密なdoctypeで検証されます。 、CSSで完全にスタイル設定できます。

0
Mathias Bynens