Regex: несколько групп захвата - поиск и замена - журналы DNS

Наткнулся на регулярное выражение пробелем и нужна рука. По сути, у меня есть журналы DNS, которые приходят так:

8/21/2014 9:32:20 AM 0E5C PACKET  000000298F0CA280 UDP Rcv 10.2.56.13      136b   Q [0001   D   NOERROR] PTR    (2)25(2)21(1)5(2)10(7)in-addr(4)arpa(0)
8/21/2014 9:32:20 AM 0E60 PACKET  000000298EE81DF0 UDP Rcv 10.2.4.60       7d30   Q [0001   D   NOERROR] A      (14)usca-cdst-sw01(3)domain(3)com(0)
8/21/2014 9:32:20 AM 0E60 PACKET  00000029936FBF70 UDP Rcv 10.2.4.60       ce83   Q [0001   D   NOERROR] A      (14)usca-edge-sw01(3)domain(3)com(0)
8/21/2014 9:32:20 AM 0E60 PACKET  0000002990241FD0 UDP Rcv 10.2.4.60       1753   Q [0001   D   NOERROR] A      (14)usca-edge-sw02(3)domain(3)com(0)
8/21/2014 9:32:20 AM 0E60 PACKET  000000298EE81DF0 UDP Rcv 10.2.4.60       14b1   Q [0001   D   NOERROR] A      (14)ussp-usrv-rt01(3)domain(3)com(0)
8/21/2014 9:32:20 AM 0E60 PACKET  00000029936FBF70 UDP Rcv 10.2.4.60       db29   Q [0001   D   NOERROR] A      (14)usxo-core-vg02(3)domain(3)com(0)
8/21/2014 9:32:20 AM 0E60 PACKET  0000002990241FD0 UDP Rcv 10.2.29.29      3987   Q [0001   D   NOERROR] PTR    (3)247(1)4(1)5(2)10(7)in-addr(4)arpa(0)
8/21/2014 9:32:20 AM 0E60 PACKET  0000002990241FD0 UDP Rcv 10.2.29.29      0abd   Q [0001   D   NOERROR] PTR    (3)219(2)14(1)1(2)10(7)in-addr(4)arpa(0)
8/21/2014 9:32:20 AM 0E60 PACKET  000000298EE81DF0 UDP Rcv 10.2.4.60       42b1   Q [0001   D   NOERROR] A      (14)brca-rvrb-wo01(3)bru(3)domain(3)com(0)

В конце каждого события вы увидите что-то вроде "(14)ussp-usrv-rt01(3)domain(3)com(0)"

По сути, я пытаюсь написать регулярное выражение, чтобы преобразовать это в "ussp-usrv-rt01.domain.com"

Моя стратегия состояла в том, чтобы захватить все после NOERROR]\s+\w+\s+ до конца строки, а затем заменить круглые скобки точкой. Имея trobule, получая это только правильно.

Какие-либо предложения? Спасибо!

1 ответ

Решение

Учитывая, что ваши имена хостов имеют различные форматы (имена хостов, имена reversePTR и т. Д.), Вам, вероятно, будет лучше сделать это в два этапа:

/\s(\(.*\))$/

захватить (3)216....arpa(0) вещи, то вы можете использовать

implode('.' , preg_split('|\(\d+\)|', ...))

взорвать отдельные (числовые) биты и объединить с . вместо.

Другие вопросы по тегам