解析IP:来自字符串的端口,端口后面有字符#

时间:2014-07-05 06:33:39

标签: php regex

我需要一点这方面的帮助,我的RegEx知识有点缺乏这个。

我有一个代理列表,我正在尝试解析并将字符串中的IP和端口号分开。

正在读取的字符串如下所示。(示例1)

121.121.121.121:8081    2.103384    Китай   high    05-07-2014 09:25:17

有时看起来像(例2)

222.222.222.222:8081

当我使用此代码时。

preg_match_all('@[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,4}\.@',$ip,$results);
$output = (preg_split('/:/',$results));
$ip = $output['0'];
$port = $output['1'];

当只有IP时,它很有用:端口就像例子#2,但在例子#1中 它也抓住了空间的一切,所以端口号看起来像“80812.103384Китайhigh05-07-2014 09:25:17”

我是否可以使用正则表达式模式让它停在空间中,如果它看到的那个?

3 个答案:

答案 0 :(得分:2)

通过拆分,您只能匹配您不想要的东西;在这种情况下,你可能想要匹配。

以下匹配表达式适用于您的情况:

if (preg_match('/^(\d[\d.]+):(\d+)\b/', $proxy, $matches)) {
    $ip = $matches[1];
    $port = $matches[2];
}

答案 1 :(得分:1)

此正则表达式将匹配ip-address和端口号

\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}:[0-9]{1,5}\b

DEMO

由此可以轻松拆分。

OR

您可以使用preg_match功能

<?php
$str = '121.121.121.121:8081    2.103384    Китай   high    05-07-2014 09:25:17';
if (preg_match('~\b([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}):([0-9]{1,5}\b)~', $str, $matches)) {
    $ip = $matches[1];
    $port = $matches[2];
}
echo "$ip\n";
echo "$port\n";
?>

输出:

121.121.121.121
8081

答案 2 :(得分:1)

由于无需在此级别验证IP地址,因此可以采用更短的方式来匹配它们:

(\d+(?(?!:)\.)){4}:\d+

Live demo

<强> PHP

preg_match_all('@(\d+(?(?!:)\.)){4}:\d+@', $ip, $results);