2011-03-29 181 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