我需要一点这方面的帮助,我的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”
我是否可以使用正则表达式模式让它停在空间中,如果它看到的那个?
答案 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
由此可以轻松拆分。
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+
<强> PHP 强>:
preg_match_all('@(\d+(?(?!:)\.)){4}:\d+@', $ip, $results);