首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP strtok() 函數深度解析:可控節奏的字串分割利器

     編輯:PHP 相關知識

strtok() vs explode()

特性strtok()explode()
分割符多個單字元分隔符單一字串分隔符
記憶體流式處理,省記憶體一次產生整個陣列
控制權迴圈中可動態改分隔符、中斷一次性完成
中文支援不支援多位元組分隔符支援

基本語法

// 首次呼叫需傳入字串與分隔符
$token = strtok($string, $delimiters);

// 後續呼叫只需傳入分隔符(可改變)
$token = strtok($newDelimiters);

// 回傳 false 表示結束

實戰範例

範例 1:多重分隔符

$string = "This is\ta\nstring";
$tok = strtok($string, " \n\t"); // 空格、換行、Tab
while ($tok !== false) {
    echo "$tok\n";
    $tok = strtok(" \n\t");
}
/* 輸出:
This
is
an
example
string
*/

範例 2:動態切換分隔符

$string = "這是PHP論壇 論壇版塊 論壇欄目 論壇H管理員 論壇會員";
$tok = strtok($string, " H"); // 初始:空格 + H
$n = 1;
while ($tok !== false) {
    echo "$tok\n";
    if ($n++ > 2) break; // 任意中斷
    $tok = strtok(" "); // 之後只用空格分割
}
/* 輸出:
這是P
P 論壇
論壇版塊
*/

範例 3:for 迴圈寫法

$line = "leon\tatkinson\tleon@clearink.com";
for ($token = strtok($line, "\t"); $token !== false; $token = strtok("\t")) {
    echo "token: $token\n";
}
/* 輸出:
token: leon
token: atkinson
token: leon@clearink.com
*/

範例 4:解析複雜格式(CSV 變體)

$data = "id:123|name:John|role:admin;id:456|name:Jane|role:user";
// 第一層分割:記錄分隔符 ;
$record = strtok($data, ';');
while ($record !== false) {
    // 第二層分割:欄位分隔符 |
    $field = strtok($record, '|');
    $row = [];
    while ($field !== false) {
        // 第三層:鍵值分隔符 :
        [$key, $val] = explode(':', $field, 2);
        $row[$key] = $val;
        $field = strtok('|');
    }
    echo json_encode($row) . "\n";
    $record = strtok(';');
}
/* 輸出:
{"id":"123","name":"John","role":"admin"}
{"id":"456","name":"Jane","role":"user"}
*/

注意事項與陷阱

  1. 狀態保持:strtok 內部維持狀態,**非執行緒安全**,同一腳本並行呼叫會互相干擾
  2. 空字串處理:連續分隔符會產生空 token,需自行過濾
  3. 中文分隔符:不可用多位元組字元**做分隔符**,會導致亂碼
  4. 修改原字串:strtok 不修改原字串,但內部指標會移動
  5. 重置狀態:呼叫 strtok('', '') 可重置內部狀態

現代替代方案

// PHP 8.0+ 推薦:strtok 替代品
// 1. 簡單分割
$parts = explode('|', $string);

// 2. 正則分割(支援多字元、Unicode)
$parts = preg_split('/[\s,;|]+/u', $string);

// 3. 迭代器模式(大字串、記憶體友善)
function tokenIterator(string $string, string $delimiters): Generator {
    $token = strtok($string, $delimiters);
    while ($token !== false) {
        yield $token;
        $token = strtok($delimiters);
    }
}
foreach (tokenIterator($bigString, ',') as $token) { /* ... */ }

總結

strtok() 適合:記憶體敏感、需動態控制分割流程、單字元分隔符 的場景。現代專案多改用 explode()、preg_split() 或 Generator 迭代器,程式碼更清晰且支援 Unicode。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved