「說技術」 PHP如何從字串中過濾出中文

扣丁禪師發表於2020-10-16

「說技術」 PHP如何從字串中過濾出中文

實現目標

輸入字串:”012\x99 走過的路,不要再走”,處理後,只保留漢字 “走過的路不要再走”

實現過程

1、從 utf-8 字元編碼轉化為 GB2312 多位元組編碼

2、GB2312漢字編碼範圍 [xb0-xf7][xa0-xfe],每兩個位元組形成一箇中文字元

3、使用 PHP 位元組操作函式 unpack 提取字元的二進位制

4、提取出中文字元

PHP 程式碼

    /**
     * 過濾出一句話中的中文字元
     *
     * @param string $sentence
     * @return string
     */
    public function filterGB2312Words($sentence)
    {
        $filterWords = '';
        for ($i = 0, $iMax = mb_strlen($sentence); $i < $iMax; $i++) {
            $wordUtf8 = mb_substr($sentence, $i, 1);
            $wordGb2312 = iconv('utf-8', 'gb2312//IGNORE', $wordUtf8);
            if (strlen($wordGb2312) < 2) {
                // 不是中文, 跳過
                continue;
            }

            $byte1 = unpack('C', $wordGb2312, 0)[1];
            $byte2 = unpack('C', $wordGb2312, 1)[1];

            // https://www.wenjiangs.com/group/topic-19158.html
            // GB2312漢字: [xb0-xf7][xa0-xfe]
            if (($byte1 >= ord("\xb0") && $byte1 <= ord("\xf7")) && ($byte2 >= ord("\xa0") && $byte2 <= ord("\xfe"))) {
                $filterWords .= $wordUtf8;
            }
        }

        return $filterWords;
    }
/**
 * 測試過濾中文字元,忽略半形或英文字元
 *
 * @return void
 */
public function testGB2312Words()
{
    $sentence = "012\x99 走過的路,不要再走";
    $result = $this->filterGB2312Words($sentence);
    $this->assertEquals('走過的路不要再走', $result);
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
我是不敲木魚敲程式碼的禪師,技術創業者,喜歡內省,專注研究軟體產品的基因

相關文章