當前位置: 首頁> 最新文章列表> 如何用stream_filter_append 創建簡單的文本轉換過濾器?

如何用stream_filter_append 創建簡單的文本轉換過濾器?

gitbox 2025-09-29

如何用stream_filter_append創建簡單的文本轉換過濾器?

在PHP 中, stream_filter_append()函數允許我們為流(stream)附加一個過濾器,這樣就可以對流中的數據進行實時的處理和轉換。本文將介紹如何利用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>
  • $stream :要附加過濾器的流。

  • $filtername :過濾器的名稱,可以是內建的過濾器或自定義的過濾器。

  • $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>, &amp;</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>-&gt;data = </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$bucket</span></span><span>-&gt;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>

在這個類中, filter()方法是最關鍵的部分,它會接收輸入流的數據,將其轉換為大寫後再輸出到目標流。

步驟二:註冊過濾器

接下來,我們需要使用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>

通過這個步驟,我們將UppercaseFilter註冊為一個名為uppercase的過濾器,供我們在流處理中使用。

步驟三:使用stream_filter_append()添加過濾器

我們可以通過stream_filter_append()將註冊的過濾器附加到一個流上。下面是一個例子,展示如何讀取一個文本文件,並通過流過濾器將其內容轉換​​為大寫。

 <span><span><span class="hljs-meta">&lt;?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">?&gt;</span></span><span>
</span></span>

在上面的例子中,我們打開了一個名為example.txt的文件,並將uppercase過濾器附加到文件流上。每當我們讀取流中的數據時,過濾器會自動將其轉換為大寫字母,然後再輸出。

步驟四:測試和驗證

假設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() ,我們可以輕鬆地為流添加過濾器,以實現對數據的實時處理。在本文中,我們創建了一個簡單的文本轉換過濾器,將輸入文本轉換為大寫。通過自定義過濾器和流的組合,PHP 提供了強大的流數據處理能力,能夠滿足各種複雜的場景需求。

希望通過這個簡單的例子,您能夠理解如何使用stream_filter_append()來創建自己的流過濾器並應用於文本處理。