php - 正则表达式将多行文本处理为单个字符串 PHP
问题描述
我有以下文本输入。
Group 1,Good,LEADS,"Leads Description 1
Leads Description 2","Note 1
Note 2",1,100,210,10,Amt,15%
Group 2,Good, SWITCHING, Switching, Description 1, "Switching Note 1
Switching Note 2",4,130,210,15,Amt,15%
Group 1,Service,LICENCE,Licence Description 1,Licence Note 1,2,200,400,5,Pct,15%
描述和注释可以在同一行,也可以有多行值。这些是总共3行。当描述和注释是多行时,文本在Double Quotes ""
没有多行描述的行中,或者注意一个简单的爆炸正在工作,但对于它们中的任何一个都在多行中。我正在使用以下语句来解析它。
preg_split("/\n|\r\n?/", $text);
此语句适用于行,它只需要处理一个条件,将双引号之间的文本视为一行。
编辑:上面的 Text 被分配给 $text
解决方案
而不是拆分尝试通过正则表达式对它们进行分组:
<?php
$s = 'Group 1,Good,LEADS,"Leads Description 1
Leads Description 2","Note 1
Note 2",1,100,210,10,Amt,15%
Group 2,Good, SWITCHING, Switching, Description 1, "Switching Note 1
Switching Note 2",4,130,210,15,Amt,15%
Group 1,Service,LICENCE,Licence Description 1,Licence Note 1,2,200,400,5,Pct,15%
';
if (preg_match_all('/([^\r\n"]+|"[^"]*")+/', $s, $pregres)) {
print_r($pregres[0]);
}
输出:
Array
(
[0] => Group 1,Good,LEADS,"Leads Description 1
Leads Description 2","Note 1
Note 2",1,100,210,10,Amt,15%
[1] => Group 2,Good, SWITCHING, Switching, Description 1, "Switching Note 1
Switching Note 2",4,130,210,15,Amt,15%
[2] => Group 1,Service,LICENCE,Licence Description 1,Licence Note 1,2,200,400,5,Pct,15%
)
正则表达式解释
([^\r\n"]+|"[^"]*")+
括号内有两个选项(由or |
分隔):
[^\r\n"]+
- 查找不是回车、换行或双引号的字符序列。这将寻找未引用的刺痛,直到它遇到任何换行符
"[^"]*"
- 查找以双引号开头和结尾并包含除引号之外的任何字符的序列。这将消耗整个带引号的字符串,包括引号内的所有换行符。
它们被分组到括号中,整个组允许重复(+
后面跟着括号。这将消耗整个字符串,直到引号外有换行符。
重复引用(例如"this is a ""quoted"" string"
)也被消耗。
推荐阅读
- python - 如何使用 numpy 将数组线性拉伸到更大的尺寸?
- java - Eclipse 在自动完成时速度极慢
- javascript - 工具提示在您点击离开后保持打开状态
- jquery - jQuery多选另一个自动多选
- php - Laravel 为什么数据透视表是空的?
- javascript - window.location.replace 偶尔不运行
- sql - 使用 IN 子句的 SQL 偏移总行数变慢
- python - ValueError: 预期 ndim=3,替换 BatchNormalization 后发现 ndim=2
- c# - Xamarin Forms C# Live 计算地理位置距离
- node.js - 在 array.foreach 中查询数据库 Sequelize