Хорошо, поэтому я создаю небольшой скребок IP: PORT в PHP. Проблема в том, что я довольно незнакома с RegEx.
Поэтому я собирался вместе, что могу.
Вот что у меня есть: /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):([0-9]{1,5})\b/
Я знаю, что это не самое лучшее. По крайней мере, не конец захвата порта, потому что это означает, что порты смогут быть такими, как 99999.
Кроме того, кажется, что он возвращает два матча таким образом. IP: ПОРТ и ПОРТ. Мне просто нужно это, чтобы захватить полный IP: ПОРТ, а не тот или другой.
Может ли кто-нибудь помочь?
Ваше регулярное выражение прекрасно, поэтому я просто сосредоточусь на самом порту. Это регулярное выражение:
(?:: #Match the : (?![7-9]\d\d\d\d) #Ignrore anything above 7.... (?!6[6-9]\d\d\d) #Ignore anything abovr 69... (?!65[6-9]\d\d) #etc... (?!655[4-9]\d) (?!6553[6-9]) (?!0+) #ignore complete 0(s) (?<Port>\d{1,5}) )?
По желанию поймает любой действительный номер порта и сохранит его в именованный групповой порт.
Примечание. Свободный интервал должен быть включен:
if (preg_match( '/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) (?:: (?![7-9]\d\d\d\d) #Ignrore anything above 7.... (?!6[6-9]\d\d\d) #Ignore anything abovr 69... (?!65[6-9]\d\d) #etc... (?!655[4-9]\d) (?!6553[6-9]) (?!0+) #ignore complete 0(s) (?P<Port>\d{1,5}) )? \b/x', $subject)) { # Successful match }
&if (preg_match( '/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) (?:: (?![7-9]\d\d\d\d) #Ignrore anything above 7.... (?!6[6-9]\d\d\d) #Ignore anything abovr 69... (?!65[6-9]\d\d) #etc... (?!655[4-9]\d) (?!6553[6-9]) (?!0+) #ignore complete 0(s) (?P<Port>\d{1,5}) )? \b/x', $subject)) { # Successful match }
;if (preg_match( '/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) (?:: (?![7-9]\d\d\d\d) #Ignrore anything above 7.... (?!6[6-9]\d\d\d) #Ignore anything abovr 69... (?!65[6-9]\d\d) #etc... (?!655[4-9]\d) (?!6553[6-9]) (?!0+) #ignore complete 0(s) (?P<Port>\d{1,5}) )? \b/x', $subject)) { # Successful match }
Я разместил регулярное выражение ниже того, что соответствует ip или ip и порту.
$ip = '111.222.333.444'; if ( preg_match('/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\:?([0-9]{1,5})?/', $ip, $match) ) { echo 'ip: ' . $match['1'] . (isset($match['2']) ? ' port: ' . $match['2'] : ''); }
Вы можете попробовать следующее:
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):\d{1,5}\b
Здесь приведено несколько примеров для сопоставления IP-адресов. Просто возьмите любой из них и положите :\d{1,5}\b
на конец (чтобы соответствовать порту).
Я использовал это давным-давно.
[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3}:[0-9]{5}