當前位置: 首頁> 最新文章列表> 讀取外部文件前如何用ctype_cntrl 檢查控製字符,避免file_get_contents 出錯?

讀取外部文件前如何用ctype_cntrl 檢查控製字符,避免file_get_contents 出錯?

M66 2025-08-07
<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-comment">// 讀取外部文件前如何用 ctype_cntrl 檢查控製字符,避免 file_get_contents 出錯?</span></span><span>
</span><span><span class="hljs-comment">// -------------------------------------------</span></span><span>

</span><span><span class="hljs-comment">// 在 PHP 中,file_get_contents 是讀取文件內容的常用函數,但當文件包含某些控製字符時,讀取過程可能出現意外情況或錯誤。</span></span><span>
</span><span><span class="hljs-comment">// 為了避免這種問題,可以在讀取文件前,先用 ctype_cntrl 函數檢查文件內容是否包含控製字符,從而提前處理或過濾,保證程序的穩定性。</span></span><span>

</span><span><span class="hljs-comment">// 什麼是控製字符?</span></span><span>
</span><span><span class="hljs-comment">// 控製字符指的是 ASCII 碼中非打印字符,範圍通常是 0x00~0x1F 及 0x7F,這些字符在文本文件中通常不應該出現,或者是特殊格式的標誌。</span></span><span>

</span><span><span class="hljs-comment">// 下面介紹如何使用 ctype_cntrl 檢測並過濾控製字符,確保 file_get_contents 正常讀取:</span></span><span>

</span><span><span class="hljs-comment">// 1. 讀取文件原始內容</span></span><span>
</span><span><span class="hljs-variable">$filename</span></span><span> = </span><span><span class="hljs-string">'example.txt'</span></span><span>;
</span><span><span class="hljs-variable">$content</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$content</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"無法讀取文件: <span class="hljs-subst">$filename</span></span></span><span>");
}

</span><span><span class="hljs-comment">// 2. 遍歷內容檢查是否存在控製字符</span></span><span>
</span><span><span class="hljs-comment">// ctype_cntrl 只能檢查單個字符是否是控製字符,因此需要逐字符判斷</span></span><span>
</span><span><span class="hljs-variable">$hasControlChars</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>;
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$content</span></span><span>); </span><span><span class="hljs-variable">$i</span></span><span>++) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">ctype_cntrl</span></span><span>(</span><span><span class="hljs-variable">$content</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>])) {
        </span><span><span class="hljs-variable">$hasControlChars</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>;
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
}

</span><span><span class="hljs-comment">// 3. 根據檢測結果處理</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$hasControlChars</span></span><span>) {
    </span><span><span class="hljs-comment">// 若有控製字符,可以選擇過濾</span></span><span>
    </span><span><span class="hljs-variable">$filteredContent</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &lt; </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$content</span></span><span>); </span><span><span class="hljs-variable">$i</span></span><span>++) {
        </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">ctype_cntrl</span></span><span>(</span><span><span class="hljs-variable">$content</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>])) {
            </span><span><span class="hljs-variable">$filteredContent</span></span><span> .= </span><span><span class="hljs-variable">$content</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>];
        }
    }
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"檢測到控製字符,已過濾後的內容:\n"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$filteredContent</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// 無控製字符,直接使用內容</span></span><span>
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"文件內容正常:\n"</span></span><span>;
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$content</span></span><span>;
}

</span><span><span class="hljs-comment">// -------------------------------------------</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>