$lines = array(' a1 15 1.00 -2.00 (3.00) 4.00 5.00 6.00 7.00 8.00 9','a2 1.10 -2.20 (3.30) 4.40 5.50 6.60 7.70 8.80 4');
foreach($lines as $line)
{
preg_match_all('/\s+\(?-?\d+(\.\d+|(?!\d*\.[^\d]))\)?/',$line,$data);
$result[] = $data[0];
}
print_r($result);
結果是
Array
(
[0] => Array
(
[0] => 15
[1] => 1.00
[2] => -2.00
[3] => (3.00)
[4] => 4.00
[5] => 5.00
[6] => 6.00
[7] => 7.00
[8] => 8.00
[9] => 9
)
[1] => Array
(
[0] => 1.10
[1] => -2.20
[2] => (3.30)
[3] => 4.40
[4] => 5.50
[5] => 6.60
[6] => 7.70
[7] => 8.80
[8] => 4
)
)
$result[1]的陣列裡面
缺了一項
所以它的數量是9
請問正規要怎麼改
才能讓
$result[1]的內容為
[0] =>
[1] => 1.10
[2] => -2.20
[3] => (3.30)
[4] => 4.40
[5] => 5.50
[6] => 6.60
[7] => 7.70
[8] => 8.80
[9] => 4
也就是缺的第1頁補空值
另外問一下
是不是要抓的 $line 裡面
數字格式要對齊才好抓呢
例如
2行line的內容
a1 15 1.00 -2.00 (3.00) 4.00 5.00 6.00 7.00 8.00 9
a2 1.10 -2.20 (3.30) 4.40 5.50 6.60 7.70 8.80 4
就是同欄位的格式要一樣(數字對數字,浮點數對浮點數)
這樣子來弄抓缺項才會可行呢
RegExp 沒有比對不到就補空值這種用途。雖然硬要去比對出十個數值不是不行,不過解出來的樣版根本彈性(適用性、維護性)很低。因為太複雜。
寫程式,別一味死腦筋去鑽牛角尖。一定非得用 RegExp 去解是否有遺漏嗎?像你的這個例子,只需要在4,5行之間補一行:
<pre class="c" name="code">while (count($data[0]) < 10) array_unshift($data[0], '');
不就好了嗎?