PHPでは、 Stream_Filter_Append()関数により、ストリームにフィルターを接続できるようになり、ストリーム内のデータをリアルタイムで処理および変換できます。この記事では、 Stream_Filter_Append()を使用して、単純なテキスト変換フィルターを作成し、ストリーム内のデータを操作し、大文字の変換、小文字の変換など、いくつかの一般的なテキスト変換を実行する方法を紹介します。
Stream_Filter_Append()は、特定のストリームにフィルターを追加できるPHPビルトイン関数です。フィルターの機能は、変更、変換、圧縮など、ストリーム内のデータを処理することです。フローフィルターは、組み込みまたはカスタマイズできます。
<span><span><span class="hljs-title function_ invoke__">stream_filter_append</span></span><span>(resource </span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filtername</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$read_write</span></span><span> = STREAM_FILTER_READ, </span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$params</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>$ストリーム:フィルターを取り付けるためのストリーム。
$フィルタン:フィルターの名前。ビルトインフィルターまたはカスタムフィルターを使用できます。
$ read_write :ストリームの読み取りか書き込みかを指定します。 stream_filter_readは読み取りストリームを表し、 stream_filter_writeは書き込みストリームを表します。
$ params :フィルターに渡されたパラメーター(オプション)。
テキスト変換フィルターを作成する例は次のとおりです。テキストを大文字に変換するフィルターを実装します。
まず、シンプルなフィルタークラスを作成し、 php_user_filterクラスを継承し、そのメソッドを実装する必要があります。このフィルターは、ストリーム内のテキストを大文字に変換します。
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">UppercaseFilter</span></span><span> </span><span><span class="hljs-keyword">extends</span></span><span> </span><span><span class="hljs-title">php_user_filter</span></span><span> {
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">filter</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$in</span></span></span><span>, </span><span><span class="hljs-variable">$out</span></span><span>, &</span><span><span class="hljs-variable">$consumed</span></span><span>, </span><span><span class="hljs-variable">$closing</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$bucket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_bucket_make_writeable</span></span><span>(</span><span><span class="hljs-variable">$in</span></span><span>)) {
</span><span><span class="hljs-comment">// ストリームのデータを大文字に変換します</span></span><span>
</span><span><span class="hljs-variable">$bucket</span></span><span>->data = </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$bucket</span></span><span>->data);
</span><span><span class="hljs-comment">// 変換されたデータをターゲットストリームに出力します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_bucket_append</span></span><span>(</span><span><span class="hljs-variable">$out</span></span><span>, </span><span><span class="hljs-variable">$bucket</span></span><span>);
}
</span><span><span class="hljs-keyword">return</span></span><span> PSFS_PASS_ON;
}
}
</span></span>このクラスでは、フィルター()メソッドが最も重要な部分です。入力ストリームのデータを受信し、大文字に変換してから、ターゲットストリームに出力します。
次に、 Stream_filter_register()関数を使用して、このカスタムフィルターをPHP環境に登録する必要があります。
<span><span><span class="hljs-title function_ invoke__">stream_filter_register</span></span><span>(</span><span><span class="hljs-string">"uppercase"</span></span><span>, </span><span><span class="hljs-string">"UppercaseFilter"</span></span><span>) </span><span><span class="hljs-keyword">or</span></span><span> </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Filter registration failed"</span></span><span>);
</span></span>このステップを通じて、 ApperCaseFilterを大文字と呼ばれるフィルターとして登録して、ストリーム処理で使用します。
Stream_filter_append()を介して登録されたフィルターをストリームに接続できます。テキストファイルを読み取り、ストリームフィルターを介してコンテンツを大文字に変換する方法を示す例を示します。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// フィルターを登録します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_filter_register</span></span><span>(</span><span><span class="hljs-string">"uppercase"</span></span><span>, </span><span><span class="hljs-string">"UppercaseFilter"</span></span><span>) </span><span><span class="hljs-keyword">or</span></span><span> </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Filter registration failed"</span></span><span>);
</span><span><span class="hljs-comment">// ファイルストリームを開きます</span></span><span>
</span><span><span class="hljs-variable">$stream</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">"example.txt"</span></span><span>, </span><span><span class="hljs-string">"r"</span></span><span>);
</span><span><span class="hljs-comment">// ファイルストリームにカスタム変換フィルターを接続します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_filter_append</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-string">"uppercase"</span></span><span>, STREAM_FILTER_READ);
</span><span><span class="hljs-comment">// ファイルのコンテンツを読んで出力します</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$line</span></span><span>;
}
</span><span><span class="hljs-comment">// ファイルストリームを閉じます</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>上記の例では、 example.txtという名前のファイルを開き、大文字フィルターをファイルストリームに添付します。ストリーム内のデータを読み取るたびに、フィルターは自動的に大文字に変換し、出力します。
example.txtファイルのコンテンツは次のとおりであると仮定します。
<span><span>hello world
</span><span><span class="hljs-keyword">this</span></span><span> </span><span><span class="hljs-keyword">is</span></span><span> a test.
</span></span>上記のコードを実行した後、出力は次のとおりです。
<span><span>HELLO WORLD
THIS IS </span><span><span class="hljs-selector-tag">A</span></span><span> TEST.
</span></span>ご覧のとおり、すべてのテキストは大文字に変換されています。
Stream_filter_append()を使用すると、Filtersをストリームに簡単に追加して、データのリアルタイム処理を実現できます。この記事では、入力テキストを大文字に変換する単純なテキスト変換フィルターを作成しました。カスタムフィルターとストリームの組み合わせにより、PHPはさまざまな複雑なシナリオニーズを満たすことができる強力なストリームデータ処理機能を提供します。
この簡単な例を使用して、 Stream_Filter_Append()を使用して独自のストリームフィルターを作成し、テキスト処理に適用する方法を理解できることを願っています。