Shlex は、C で書かれた PHP 拡張機能です。この拡張機能は、Python の shlex ライブラリの機能を実装します。ユーザーが Shlex 拡張機能にもっと慣れるために、拡張機能によって実装されるクラスは、プロパティ名とメソッド名の点で Python Shlex ライブラリと基本的に同じです。インターフェイスのドキュメントも、Python shlex ライブラリのインターフェイスのドキュメントから変更されています。
Shlex を使用すると、Unix シェルに似た単純な構文の字句アナライザーを簡単に作成できます。これは、ミニ言語を作成したり、引用符で囲まれた文字列を解析したりする場合に役立ちます。
phpize
./configure
make && make install
Windows システムは現在サポートされていません。
シェルのような構文を使用して文字列 s を分割します。
array shlex_split( string|resource|null $s [, bool $comments = false [, bool $posix = true ]] )
シェルのような構文を使用して文字列 s を分割します。
Note:
Since the shlex_split() function instantiates a shlex instance, passing null for s will read the string to split from standard input.
コメントが false (デフォルト) の場合、指定された文字列内のコメントの解析は無効になります (shlex インスタンスの commenters 属性を空の文字列に設定します)。
この関数はデフォルトでは POSIX モードで動作しますが、posix 引数が false の場合は非 POSIX モードを使用します。
分割された文字列の配列を返します。
<?php
$s = "foo#bar";
$ret = shlex_split($s, true);
var_dump($ret);
?>
上記の例では次のように出力されます。
array(1) {
[0] =>
string(3) "foo"
}
文字列 s のシェルエスケープバージョンを返します。
string shlex_quote( string $s )
エスケープする文字列。
戻り値は、リストを使用できない場合に、シェル コマンド ラインで 1 つのトークンとして安全に使用できる文字列です。
<?php
// If the output is executed, it will cause the index.php file to be deleted.
$filename = "somefile; rm -rf index.php";
$command = sprintf("ls -l %s", $filename);
echo $command;
echo "n";
// shlex_quote() blocked the vulnerability
$command = sprintf("ls -l %s", shlex_quote($filename));
echo $command;
echo "n";
// remote connection
$remoteCommand = sprintf("ssh home %s", shlex_quote($command));
echo $remoteCommand;
echo "n";
?>
上記の例では次のように出力されます。
ls -l somefile; rm -rf index.php
ls -l 'somefile; rm -rf index.php'
ssh home 'ls -l '"'"'somefile; rm -rf index.php'"'"''
Shlex インスタンスまたはサブクラス インスタンスは字句解析オブジェクトです。
Shlex implements Iterator {
/* Properties */
public resource|null $instream = null;
public string|null $infile = null;
private bool|null $posix = null;
public string|null $eof = null;
public string $commenters = '#';
public string $wordchars = 'abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_';
public string $whitespace = " trn";
public bool $whitespaceSplit = false;
public string $quotes = ''"';
public string $escape = '\';
public string $escapedquotes = '"';
private string $state = ' ';
private array $pushback = [];
public int $lineno = 1;
public int $debug = 0;
public string $token = '';
private array $filestack = [];
public string|null $source = null;
public string|null $punctuationChars = null;
private array|null $_punctuationChars = null;
/* Methods */
public void function __construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]]);
public void function __destruct( void );
public void function key( void );
public void function next( void );
public void function rewind( void );
public string|null function current( void );
public bool function valid( void );
public void function pushToken( string $tok );
public void function pushSource( string|resource $newstream, string|null $newfile = null );
public void function popSource( void );
public string|null|ShlexException function getToken( void );
public string|null|ShlexException function readToken( void );
public array function sourcehook( string $newfile );
public string function errorLeader( string $infile = null, int|null $lineno = null );
}
この Shlex インスタンスが文字を読み取る入力ストリーム。
現在の入力ファイルの名前。クラスのインスタンス化時に最初に設定されるか、後のソース要求によってスタックされます。エラー メッセージを作成するときにこれを調べると役立つ場合があります。
ファイルの終わりを判断するために使用されるトークン。これは、非 POSIX モードでは空の文字列 ('') に設定され、POSIX モードでは null に設定されます。
コメント初心者と認識される文字列。コメントの先頭から行末までのすべての文字は無視されます。デフォルトでは「#」のみが含まれます。
複数文字トークンに蓄積される文字列。デフォルトでは、すべての ASCII 英数字とアンダースコアが含まれます。 POSIX モードでは、Latin-1 セットのアクセント付き文字も含まれます。 punctuationChars が空でない場合、ファイル名仕様およびコマンド ライン パラメータに現れる文字 ~-./*?= もこの属性に含まれ、punctuationChars に現れる文字は、空でない場合は wordchars から削除されます。そこに存在します。
空白とみなされスキップされる文字。空白はトークンを境界付けます。デフォルトでは、スペース、タブ、ラインフィード、キャリッジリターンが含まれます。
true の場合、トークンは空白でのみ分割されます。これは、たとえば、Shlex でコマンド ラインを解析し、シェル引数と同様の方法でトークンを取得する場合に便利です。この属性が true の場合、punctuationChars は効果がなく、分割は空白でのみ発生します。シェルによって実装される解析に近い解析を提供することを目的とした punctuationChars を使用する場合は、whitespaceSplit を false (デフォルト値) のままにすることをお勧めします。
文字列引用符とみなされる文字。トークンは、同じ引用符が再び出現するまで蓄積されます (したがって、シェル内と同様に、異なる引用符タイプが相互に保護します)。デフォルトでは、ASCII の一重引用符と二重引用符が含まれます。
エスケープとみなされる文字。これは POSIX モードでのみ使用され、デフォルトでは '' だけが含まれます。
エスケープで定義されたエスケープ文字を解釈する引用符内の文字。これは POSIX モードでのみ使用され、デフォルトでは「"」のみが含まれます。
ソース行番号 (これまでに検出された改行の数に 1 を加えたもの)。
この属性が 1 以上の数値の場合、Shlex インスタンスはその動作に関する詳細な進行状況出力を出力します。これを使用する必要がある場合は、モジュールのソース コードを読んで詳細を確認してください。
トークンバッファー。例外をキャッチするときにこれを調べると役立つ場合があります。
この属性はデフォルトでは null です。文字列を割り当てると、その文字列はさまざまなシェルのソース キーワードと同様の字句レベルの包含リクエストとして認識されます。つまり、直後のトークンがファイル名として開かれ、EOF までそのストリームから入力が取得されます。EOF の時点で、そのストリームの fclose() メソッドが呼び出され、入力ソースが再び元の入力ストリームになります。ソースリクエストは、任意のレベルの深さに積み重ねることができます。
句読点とみなされる文字。一連の句読点文字は 1 つのトークンとして返されます。ただし、セマンティックな妥当性チェックは実行されないことに注意してください。たとえば、「>>>」は、シェルによって認識されない場合でも、トークンとして返される可能性があります。
コンストラクタ
public void function Shlex::__construct( [ string|resource|null $instream = null [, string|null $infile = null [, bool $posix = false [, string|bool|null $punctuationChars = false ]]]])
instream 引数が存在する場合、どこから文字を読み取るかを指定します。これは、リソース タイプ変数 (fread( ) で読み取ることができる)、または文字列である必要があります。引数が指定されていない場合、入力は php://stdin から取得されます。
2 番目のオプションの引数はファイル名文字列で、infile 属性の初期値を設定します。 instream 引数が null の場合、この infile 引数は常に null になります。
posix 引数は動作モードを定義します。posix が false (デフォルト) の場合、Shlex インスタンスは互換モードで動作します。 POSIX モードで動作している場合、Shlex は POSIX シェル解析ルールにできる限り近づけようとします。
punctuationChars 引数は、動作を実際のシェルの解析方法にさらに近づける方法を提供します。これにはいくつかの値を指定できます。デフォルト値は false です。 true に設定すると、文字 ();<>|& の解析が変更され、これらの文字 (句読点文字とみなされます) の実行は単一のトークンとして返されます。空ではない文字列を設定すると、それらの文字が句読点文字として使用されます。 punctuationChars に出現する wordchars 属性の文字はすべて wordchars から削除されます。
値は返されません。
<?php
$instance = new Shlex("a && b || c", null, false, "|");
$list = [];
foreach ($instance as $value) {
$list[] = $value;
}
var_dump($list);
?>
上記の例では次のように出力されます。
array(6) {
[0] =>
string(1) "a"
[1] =>
string(1) "&"
[2] =>
string(1) "&"
[3] =>
string(1) "b"
[4] =>
string(2) "||"
[5] =>
string(1) "c"
}
デストラクター
public void function Shlex::__destruct( void )
Shlex オブジェクトによって保持されているリソース オブジェクトを解放するために使用されます。内部的には、fclose() が呼び出され、ファイル ハンドルが閉じられます。
パラメータはありません。
値は返されません。
例はありません。
Iterator インターフェースの key メソッドには実際的な用途はありません。
public void function Shlex::key( void )
パラメータはありません。
値は返されません。
例はありません。
Iterator インターフェイスの next メソッドには実際的な用途はありません。
public void function Shlex::next( void )
パラメータはありません。
値は返されません。
例はありません。
Iterator インターフェースの rewind メソッドには実際的な用途はありません。
public void function Shlex::rewind( void )
パラメータはありません。
値は返されません。
例はありません。
この反復で Shlex によって読み取られたトークン値を返します。
public string|null function Shlex::current( void )
パラメータはありません。
この反復で Shlex によって読み取られたトークン値を返します。
例はありません。
この繰り返しが有効かどうかを判断します。
public bool function Shlex::valid( void )
パラメータはありません。
true が返された場合は有効、false が返された場合は無効です。
Note:
Due to the implementation of this class, iteratively reading the next element is also called inside the method. So the next() method is invalid.
例はありません。
引数をトークン スタックにプッシュします。
public void function Shlex::pushToken( string $tok )
プッシュされるパラメータ。
値は返されません。
例はありません。
入力ソース ストリームを入力スタックにプッシュします。
public void function Shlex::pushSource( string|resource $newstream, string|null $newfile = null );
プッシュされている入力ソース ストリーム。
filename 引数が指定されている場合は、後でエラー メッセージで使用できるようになります。これは、sourcehook() メソッドによって内部的に使用されるメソッドと同じです。
値は返されません。
例はありません。
最後にプッシュされた入力ソースを入力スタックからポップします。これは、レクサーがスタックされた入力ストリームで EOF に達したときに内部で使用される方法と同じです。
public void function Shlex::popSource( void )
パラメータはありません。
値は返されません。
例はありません。
トークンを返します。
public string|null|ShlexException function Shlex::getToken( void )
パラメータはありません。
PushToken() を使用してトークンがスタックされている場合は、スタックからトークンをポップします。それ以外の場合は、入力ストリームから 1 つを読み取ります。読み取り中にすぐにファイルの終わりに達した場合は、eof が返されます (非 POSIX モードでは空の文字列 ('')、POSIX モードでは null)。
例はありません。
生のトークンを読み取ります。
public string|null|ShlexException function Shlex::readToken( void )
生のトークンを読み取ります。プッシュバック スタックを無視し、ソース リクエストを解釈しません。 (これは通常は有用なエントリ ポイントではないため、完全を期すためにのみここに記載されています。)
パラメータはありません。
生のトークンを返します。
例はありません。
public array function Shlex::sourcehook( string $newfile )
Shlex がソース リクエスト (以下のソースを参照) を検出すると、このメソッドには引数として次のトークンが与えられ、ファイル名の配列と開いているファイルのようなオブジェクトを返すことが期待されます。
通常、このメソッドはまず引数から引用符を削除します。結果が絶対パス名である場合、または有効な以前のソース要求がなかった場合、または以前のソースがストリーム (php://stdin など) であった場合、結果はそのまま残されます。それ以外の場合、結果が相対パス名である場合は、ソース インクルード スタック上の直前のファイル名のディレクトリ部分が先頭に追加されます (この動作は、C プリプロセッサが #include "file.h" を処理する方法に似ています)。
操作の結果はファイル名として扱われ、タプルの最初のコンポーネントとして返され、それに fopen() が呼び出されて 2 番目のコンポーネントが生成されます。 (注意: これはインスタンスの初期化における引数の順序の逆です。)
このフックは、ディレクトリ検索パス、ファイル拡張子の追加、その他の名前空間ハックの実装に使用できるように公開されています。対応する「close」フックはありませんが、shlex インスタンスは、EOF を返すときにソース入力ストリームの fclose() メソッドを呼び出します。
ソーススタッキングをより明示的に制御するには、pushSource() メソッドと PopSource() メソッドを使用します。
ファイルパス。
ファイル名の配列と開いているファイルのようなオブジェクトを返します。
例はありません。
Unix C コンパイラ エラー ラベルの形式でエラー メッセージ リーダーを返します。
public string function Shlex::errorLeader( string $infile = null, int|null $lineno = null )
このメソッドは、Unix C コンパイラのエラー ラベルの形式でエラー メッセージ リーダーを生成します。形式は '"%s", line %d: ' です。%s は現在のソース ファイルの名前に置き換えられ、%d は現在の入力行番号に置き換えられます (オプションの引数を使用してこれらをオーバーライドできます)。 。
この利便性は、Shlex ユーザーが Emacs やその他の Unix ツールで理解できる標準の解析可能な形式でエラー メッセージを生成することを奨励するために提供されています。
現在のソース ファイルの名前。
現在の入力行番号。
Unix C コンパイラ エラー ラベルの形式でエラー メッセージ リーダーを返します。
例はありません。
Shlex の例外クラス
このクラスは主に、Shlex クラスが内部でエラーを実行したときにスローされる例外に使用されます。
ShlexException extends Exception {}
<?php
throw new ShlexException('No escaped character');
?>