2012-07-25 142 views
1

在我开始之前,我知道这是CSV,我知道有一个函数存在内置PHP。 我得到了以下的模式:正则表达式返回预期结果加另一行上的换行符

preg_match_all("/([^\"]|\"[^\"]*\")*?(r\n|\n\r|\r|\n)/i", $CSV, $Matches);

谁来解析这样的事情:如果我尝试添加

[2] => Array 
    (
    ) 

[3] => Array 
    (
     [0] => CAN 
     [1] => * 
     [2] => 
     [3] => 
     [4] => 
     [5] => 10000.0000 
     [6] => 19999.0000 
     [7] => 35.5000 
    ) 

[4] => Array 
    (
    ) 

[5] => Array 
    (
     [0] => CAN 
     [1] => * 
     [2] => 
     [3] => 
     [4] => 
     [5] => 0.0000 
     [6] => 4999.0000 
     [7] => 19.7500 
    ) 

[6] => Array 
    (
    ) 

Country,Region/State,City,"Zip/Postal Code\n From","Zip/Postal Code To","Weight From","Weight To","Shipping Price","Delivery Type"\n\r 
CAN,*,,,,0.0000,4999.0000,29.7500,Priority\n\r 
CAN,*,,,,10000.0000,19999.0000,35.5000,Express\n\r 
CAN,*,,,,0.0000,4999.0000,19.7500,Express\n\r 
CAN,*,,,,20000.0000,99999999.9999,59.0000,Priority\n\r 
CAN,*,,,,5000.0000,9999.0000,34.7500,Priority\n\r 
CAN,*,,,,20000.0000,99999999.9999,41.5000,Express\n\r 
CAN,*,,,,5000.0000,9999.0000,24.4500,Express\n\r 
CAN,*,,,,10000.0000,19999.0000,48.0000,Priority\n\r 
CAN,*,,,,10000.0000,19999.0000,29.7500,Standard\n\r 
CAN,*,,,,20000.0000,99999999.9999,36.5000,Standard\n\r 
CAN,*,,,,500.0000,9999.0000,20.3500,Standard\n\r 
CAN,*,,,,90.0000,499.0000,9.7500,Standard\n\r 
CAN,*,,,,50.0000,89.0000,1.8000,Standard\n\r 
CAN,*,,,,30.0000,49.0000,1.5000,Standard\n\r 
CAN,*,,,,0.0000,29.0000,1.0000,Standard\n\r 
USA,*,,,,20000.0000,99999999.9999,160.0000,Express\n\r 
USA,*,,,,10000.0000,14999.0000,76.0000,Express\n\r 
USA,*,,,,1000.0000,4999.0000,42.0000,Express\n\r 
USA,*,,,,15000.0000,19999.0000,155.0000,Priority\n\r 
USA,*,,,,5000.0000,9999.0000,94.0000,Priority\n\r 
USA,*,,,,0.0000,999.0000,75.5000,Priority\n\r 
USA,*,,,,15000.0000,19999.0000,98.0000,Express\n\r 
USA,*,,,,5000.0000,9999.0000,61.5000,Express\n\r 
USA,*,,,,0.0000,999.0000,40.0000,Express\n\r 
USA,*,,,,20000.0000,99999999.9999,230.0000,Priority\n\r 
USA,*,,,,10000.0000,14999.0000,120.0000,Priority\n\r 
USA,*,,,,1000.0000,4999.0000,61.5000,Priority\n\r 
USA,*,,,,500.0000,999.0000,25.5000,Standard\n\r 
USA,*,,,,90.0000,499.0000,13.3500,Standard\n\r 
USA,*,,,,50.0000,89.0000,3.0000,Standard\n\r 
USA,*,,,,30.0000,49.0000,1.8000,Standard\n\r 
USA,*,,,,0.0000,29.0000,1.5000,Standard\n\r 

我得到的resulst类似于?:在换行符组中仍然有效。任何人都可以帮助我,我卡在那里。谢谢。

+2

如果你知道,为什么不使用它? – OrangeDog 2012-07-25 20:03:11

+1

什么奇怪的换行符是?我从来没有见过'\ n \ r'。还有(可能与之有关?)你的正则表达式在'r'之前缺少一个反斜杠。 – 2012-07-25 20:06:31

+0

@TimPietzcker Oups,我添加了反斜杠。感谢您的注意。 '\ n \ r'只是一种可能发生的可能性。我让我的课程适合初学者。还要补充一点,在每个字符(而不是正则表达式)上生成子数组需要通过分隔符(,)来提取所有内容,而不是在双引号之间。 – 2012-07-25 20:08:59

回答

1

不知道任何php匹配的细节,我会听你的话,正则表达式工作就像你显示它(使用my preferred regex我不以相同的方式捕获)。

我假设你试图删除那些空白匹配。我也会相信这些“换行符”实际上是编码到输入中的,而不是作为文字\的和\r的和\n的。

问题似乎是“换行符”匹配两次?就像你只匹配\n一遍,然后在\r上下一遍?

最简单的解决方案是将新行限制为您知道该文件的类型:/([^\"]|\"[^\"]*\")*?(\n\r)/ 这对您有帮助吗?

另外,我会只是在每行输入使用正则表达式分割(用逗号分隔)

+0

没有上面的正则表达式只是给出了一个简单的子行数列...我创建的子数组就像我说的使用程序化而不是正则表达式。我明天将在工作中检查你的解决方案。谢谢。 – 2012-07-26 00:52:23

+0

好的,我测试了它。这很有用,但我没有使用你的解决方案。问题是:首先,我的OP帖子中出现错误。我真的需要用'?:'来不返回结果。我还首先使用'\ r \ n',然后使用'\ n'和'\ r'。组\ n \ r'已被删除。感谢您领导我。 – 2012-07-26 14:04:15

相关问题