2016-07-15 16 views
0

tl; dr strpos($haystack, '^[[H^[[2J')をPHPで書くにはどうすればよいですか?文字列のコンソールエスケープコードの位置を見つける

linuxコマンドラインアプリでは、画面全体にデータが格納され、コンソールエスケープコードが続き、カーソルが通常のループの「ホーム」位置に戻ります。私のようなので、自分のスクリプトに出力を渡されたデータにアクセスするには:私はthis example for non-blocking stream consumptionを使用するよう

$ ./otherapp | php myscript.php 

をこれは、データの連続ストリームです。

出力をデコードするには、フル・フレーム/画面いっぱいのデータを取得する必要があります。エスケープコードは、^[[H^[[2Jと表示されます。最も簡単な方法は、これらのエスケープコードを検出し、それらの間の出力を使用することです。

PHP文字列でエスケープコードをどのように表していますか?彼らの位置を検出するのにstrpos(または同等のmbstring)を使用できますか?

+0

'^ ['は端末制御シーケンスです。それはリテラル '^'の後にリテラル '['、etc ...]があります。その視覚的表現は2つの文字 '^ ['です。それはascii char(27)です。 –

+1

_エスケープコードはPHPの文字列でどのように表現されていますか?_ _このような位置にあるデータに含まれるバイト値を簡単に調べるには、 'urlencode'のようなものを使用します。次に、\ xまたは\ u [二重引用符で囲まれた文字列リテラルの構文](http://php.net/manual/en/language.types.string.php#language.types.string.syntax.double)を使用して、 euqvalent文字を含む文字列を使用して、検索と置換または分割に使用します。 – CBroe

答えて

1

あなたはUnix環境にいるようです。あなたのエスケープコードが達成するためには、echo -en "\033[H"echo -en "\033[2J"を試してみてください。だから、strpos('\033[H\033[2J', $haystack)のようなものを試してみてください。

多分追加のバックスラッシュ('\\\033[H\\\033{2J')を追加する必要があります。

strpos("\e[H\e[2J", $haystack) 

はあなたがPHPのエスケープを解釈したい場合は、二重引用符(")で囲む必要があります。\033以来

はESCで、「進値33のバイトは」、これは動作するはずです意味します特殊文字のシーケンス。

+0

ありがとう!二重引用符で '\ e'はうまく動作し、コメントの中でCBroeが暗示する' \ x1b'も同様です。私は働くために8進表記を得ることができませんでしたが、私はあまりにもハードを試していません:) – NoChecksum

関連する問題