iT邦幫忙

0

【有缺項的正規表示式???】

(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] => PCPC-626 [1] => PCPC-15 [2] => PCPC-214 )

Array ( [0] => 1/6 [1] => 1/2/3 [2] => PCPC_15_LAG1 )

Array ( [0] => 245 [1] => 245 [2] => 123.245 )

Array ( [0] => 1/10 [1] => LAG/1 [2] => 13/5 )

Array ( [0] => 245 [1] => 123.245 [2] => 1664 )

結果沒有上面
第1筆的資料
因為第1筆的資料有缺項
它少了
3.左端 vlan 或是 qinq

請問這樣子我的 regex 要怎麼改呢
謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

6
wiseguy
iT邦超人 1 級 ‧ 2013-06-29 00:58:14
最佳解答

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
)

andyto202 iT邦研究生 4 級 ‧ 2013-06-29 07:12:41 檢舉

wiseguy兄太強了
又讓我見識到
正規表示式的進階使用方法

我要發表回答

立即登入回答