如何让PHP的yaml_parse_file()函数保留空白行?
保留YAML解析后字符串中的空白行
问题场景
你在PHP 8.3中使用yaml_parse_file()读取如下YAML内容:
summary: "Apples Apples are a delicious fruit, unless they have worms in them."
解析后通过json_encode()输出时,中间的空白行被自动移除,最终结果丢失了换行间隔:
Apples Apples are a delicious fruit, unless they have worms in them.
解决方法
1. 修改YAML格式(最简便)
YAML的块字面量语法(用|标记)会严格保留字符串中的换行和空白行,比双引号字符串的行为更明确。把原YAML改成如下格式:
summary: | Apples Apples are a delicious fruit, unless they have worms in them.
这样yaml_parse_file()解析后,summary字段会完整保留中间的空白行,转JSON输出时也不会丢失格式。
2. 调整PHP解析选项
如果无法修改YAML文件,可尝试在调用解析函数时传入YAML_PARSE_NO_FOLD_LINE选项(需确保yaml扩展版本支持该参数):
// 传入解析选项禁止折叠换行 $parsedData = yaml_parse_file('your-file.yaml', 0, $docCount, [YAML_PARSE_NO_FOLD_LINE]); // 转JSON并输出 file_put_contents('output.json', json_encode($parsedData));
这个选项会强制解析器保留字符串中的原始换行结构,不会自动合并或移除空白行。
3. 手动修复(兜底方案)
如果以上方法都不可行,只能在解析后手动补全空白行。示例针对特定内容的处理:
$parsedData = yaml_parse_file('your-file.yaml'); // 匹配到"Apples"后跟单行"Apples are...",插入空白行 $parsedData['summary'] = preg_replace('/^(Apples)\n(Apples are)/', '$1\n\n$2', $parsedData['summary']); file_put_contents('output.json', json_encode($parsedData));
注意这种方法仅适用于固定格式的内容,通用性较差。
内容的提问来源于stack exchange,提问作者Patrick Kenny
相关产品推荐
相关产品推荐

