本文介绍一种可靠方法,使用 php 按行解析带编号的文本,将每行的编号前缀(如 "82.2.")与后续文本内容严格分离,避免因句内句点导致的误分割。
本文介绍一种可靠方法,使用 php 按行解析带编号的文本,将每行的编号前缀(如 "82.2.")与后续文本内容严格分离,避免因句内句点导致的误分割。
在处理结构化但格式松散的编号文本(如条款、目录或测试用例列表)时,关键挑战在于:不能简单按 ". " 全局分割——因为正文内容中可能包含句号加空格(例如 “...goes here... Some more text.”),这会导致错误切分。
正确思路是:逐行处理 → 跳过空行 → 以首个空格为界,仅分割一次,从而安全提取编号前缀与剩余内容。
以下是完整、健壮的实现方案:
$str = <<<EOD81. Text182. Text282.1. Some text382.2. Some long text goes there in two or more lines... Some more text goes here...83. Text484. Text5EOD;$result = [];foreach (explode("n", $str) as $line) { $trimmed = trim($line); // 跳过空行或纯空白行 if ($trimmed === '') { continue; } // 使用 limit=2:确保只在第一个空格处分割,保留后续所有空格和标点 $parts = explode(' ', $trimmed, 2); $prefix = $parts[0] ?? ''; $text = $parts[1] ?? ''; // 可选:验证前缀是否符合编号模式(如以数字+点结尾),增强鲁棒性 if (preg_match('/^d+(?:.d+)*.$/', $prefix)) { $result[] = [ 'prefix' => $prefix, 'content' => $text ]; }}// 输出结构化结果(便于后续使用)foreach ($result as $item) { echo sprintf('"%s" → "%s"%s', $item['prefix'], $item['content'], PHP_EOL);}
✅ 关键要点说明:
⚠️ 注意事项:
该方法简洁、高效、可扩展,适用于各类带前缀的半结构化文本解析场景。