(GESW-ZYXEL-VES-1724(PCPC-776))-776 0/23 1/1-VLAN/245
(GESW-ZYXEL-MGS-3712F-C(PCPC-626))-626 1/6-VLAN/245 1/10-VLAN/245
(GESW-ALCATEL-7450(PCPC-15))-15 1/2/3-VLAN/245 LAG/1-QINQ/123.245{Linkport:2/1/9;1/1/9;2/2/9}
(HPER-REDBACK SE-1200(PCPC-214))-214 LAG/PCPC_15_LAG1-QINQ/123.245{Linkport:10/1;12/4;12/9} 13/5-VLAN/1664
我有一個資料如上(有4行的資料)
我希望
每一行資料都能抓出5個資料,缺項補空值
這5個資料分別是
1.設備流水
2.左端 slot/port
3.左端 vlan 或是 qinq
4.右端 slot/port
5.右端 vlan 或是 qinq
有缺項補空值
我的程式如下
preg_match_all('/\(([A-Z]+-\d+)\)\)-\d+ L?A?G?\/?(\d+\/\d+\/?\d?|[A-Z]+_\d{2}_\w+|\d+\/\d+\/\d+)-?(vlan\/|qinq\/)(\d+.\d+|\d+)(\s+|\{.*\}\s+)(\d+\/\d+|lag\/\d+||\d+\/\d+\/\d+)-?(vlan\/|qinq\/)(\d+.\d+|\d+)/i',$f,$matches);
print_r($matches[1]);
echo "<hr>";
print_r($matches[2]);
echo "<hr>";
print_r($matches[4]);
echo "<hr>";
print_r($matches[6]);
echo "<hr>";
print_r($matches[8]);
跑出來的結果如下
Array ( [0] => 245 [1] => 123.245 [2] => 1664 )
結果沒有上面
第1筆的資料
因為第1筆的資料有缺項
它少了
3.左端 vlan 或是 qinq
請問這樣子我的 regex 要怎麼改呢
謝謝
preg_match_all('/\(([A-Z]+-\d+)\)\)-\d+ L?A?G?\/?(\d+\/\d+\/?\d?|[A-Z]+_\d{2}_\w+|\d+\/\d+\/\d+)(?:-?(vlan\/|qinq\/)(\d+.\d+|\d+))?(\s+|\{.*\}\s+)(\d+\/\d+|lag\/\d+||\d+\/\d+\/\d+)-?(vlan\/|qinq\/)(\d+.\d+|\d+)/i',$f,$matches);
加上如上粗體標示的 (?: 與 )? 即可允許左端 vlan 或是 qinq 有或沒有。
執行結果:
Array
(
[0] => PCPC-776
[1] => PCPC-626
[2] => PCPC-15
[3] => PCPC-214
)
Array
(
[0] => 0/23
[1] => 1/6
[2] => 1/2/3
[3] => PCPC_15_LAG1
)
Array
(
[0] =>
[1] => 245
[2] => 245
[3] => 123.245
)
Array
(
[0] => 1/1
[1] => 1/10
[2] => LAG/1
[3] => 13/5
)
Array
(
[0] => 245
[1] => 245
[2] => 123.245
[3] => 1664
)