2011-03-29 127 views
1

我从通常的形式是一个分隔的字符串值提取解析分隔字符串:麻烦在PHP

值a | VALUEB | valueC

在哪里 '|'是一个分隔符。

在这种简单的情况下,我只是使用爆炸来提取单独的值。但是,有时字符串会有括号,其中包括'|'可以在这些括号之间。例如:

值a | VALUEB [任何字符,包括“|”] | valueC

如何可以分析此字符串可靠地提取三个独立的值(值a,VALUEB [任何字符,包括“|”], valueC)。我很确定正则表达式是我最好的选择,但我一直无法弄清楚。

任何帮助表示赞赏。谢谢!

+0

所有非定界管保证在方括号内吗?方括号可以嵌套在方括号内(即'valueB [some [stuff]]')?是否可以更改数据,以便每个数据元素都用引号或其他内容(即''valA“|”valB [1 | 2]“|”valC“')? (我的猜测是没有最后一个,但它会让事情变得更容易。:-) – Wiseguy 2011-03-29 23:11:20

+0

@Wiseguy实际上对所有三个人都是。我只是更改分隔符,但无论使用哪个字符,我都会遇到同样的问题。 – 2011-03-29 23:29:58

+2

@Mark - 如果您可以控制格式,为什么不使用像CSV这样既定的格式? – thetaiko 2011-03-29 23:31:24

回答

3

根据问题的评论,您可以更改格式。既然如此,一个小调整就会让你滚动。由于它是由字符分隔的,所以您基本上正在处理一个CSV文件。通常,CSV功能允许您将数据值用分隔符之间的引号括起来。这样,如果您的分隔字符出现在一段数据中,它将被简单地解析为数据字符串的一部分,而不会被误认为是分隔符。

这就是电子表格的工作原理 - 分隔符通常是逗号或制表符,但字段仍然可以在其中包含逗号/制表符,因为它们被括在引号中。这些引号是标准CSV格式的一部分,PHP的CSV功能可以识别它们。

举一个简单的例子,你的旧字符串:

valueA|valueB|valueC 
valueA|valueB[any characters including '|']|valueC 

那么会是这样:

"valueA"|"valueB"|"valueC" 
"valueA"|"valueB[any characters including '|']"|"valueC" 

见StackOverflow的语法高亮如何捕获上面? :-)

有这样的读取和写入CSV格式的PHP函数。

从字段的数组写入CSV:fputcsv()(一个文件描述符)
读CSV到一个数组:fgetcsv()(从文件)或str_getcsv()(从一个字符串,新在5.3)

默认假定分隔符是逗号,而外壳是双引号,但您可以为这些任务指定任意字符(例如'|')。

+0

一个小提示 - 如果一个字段内出现''',应该加倍。'valueA | value“B”| valueC' =>“valueA”|“value”“B”“”|“valueC”' – thetaiko 2011-03-30 01:56:59