如何在PHP中将文本文件的问答数据拆分到数组中
问答文本拆分问题解决
问题现象
你有一个每行包含单个问答的文本文件,预期问题与答案用制表符(\t)分隔,但使用PHP代码拆分时,所有问题被合并到数组第一个元素,所有答案合并到第二个元素,无法拆分出单个问答对。
原因分析
从你的示例内容和输出结果来看,文件中实际的分隔符不是制表符(\t),而是多个连续空格。你用explode("\t", $line)拆分时,找不到制表符分隔点,所以每行的完整内容都被存入$line[0],循环输出就把所有问题连在了一起。
解决方案
方案1:用正则拆分多空格分隔的内容
直接匹配2个及以上的空白字符作为分隔符,拆分出问题和答案(避免拆分问题中的单个空格):
$fileHandler = fopen('triviaQuestions.txt', 'r'); if ($fileHandler) { while (($line = fgets($fileHandler)) !== false) { $line = trim($line); // 用2个及以上空白字符拆分,仅拆分为2部分 list($question, $answer) = preg_split('/\s{2,}/', $line, 2); echo "问题:{$question}\n"; echo "答案:{$answer}\n\n"; } fclose($fileHandler); }
方案2:先替换多空格为制表符再拆分
如果需要统一用制表符作为分隔符,可以先将文件中的多空格替换为制表符,再用原来的explode方法:
$fileHandler = fopen('triviaQuestions.txt', 'r'); if ($fileHandler) { while (($line = fgets($fileHandler)) !== false) { $line = trim($line); // 把多个连续空格替换成制表符 $formattedLine = preg_replace('/\s{2,}/', "\t", $line); $parts = explode("\t", $formattedLine); if (count($parts) === 2) { echo "问题:{$parts[0]}\n"; echo "答案:{$parts[1]}\n\n"; } } fclose($fileHandler); }
验证分隔符的方法
如果不确定文件中的实际分隔符,可以先输出转义后的内容来确认:
$fileHandler = fopen('triviaQuestions.txt', 'r'); if ($fileHandler) { while (($line = fgets($fileHandler)) !== false) { // 转义后显示实际字符,制表符会显示为	,空格显示为空格 echo htmlspecialchars($line) . "\n"; } fclose($fileHandler); }
内容的提问来源于stack exchange,提问作者Yok T
相关产品推荐
相关产品推荐

