首页 > 解决方案 > 正则表达式将多行文本处理为单个字符串 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

标签: phpregex

解决方案


而不是拆分尝试通过正则表达式对它们进行分组:

<?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")也被消耗。


推荐阅读