我试图在PHP中使用preg_split
来分解以下字符串并返回2个ip地址:
$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} 167.69.27.154:4449 { session user disabled } 167.67.27.156:4449 }";
我的代码是:
$nodesArray = preg_split("/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/", $membersStr, -1, PREG_SPLIT_NO_EMPTY);
然后暂时打印出来:
print_r($nodesArray);
然而它是一个空数组。我从在线检查器中检查了我的正则表达式并返回IP。
尝试:
preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);
echo $nodesArray[0];
打印:
Array
在我的浏览器中。
答案 0 :(得分:2)
这里不需要复杂的正则表达式。使用此正则表达式来取出第一组括号内的IP:
members \{(.*)\}
取第一组(括号之间)。然后在explode()
上{}
获取每个IP。迭代每个值,修剪它,并确保它不是空白。
修改强>
试试这个:
$membersStr = "members { 167.69.27.151:4449 {} 167.69.27.153:4449 {} }";
$ips = explode("{", $membersStr, 2);
$ips = explode("{}", $ips[1]);
foreach ($ips as $ip){
$ip = trim($ip);
if ($ip != "" && $ip != "}")
echo $ip . "<br/>";
}
members {
167.69.97.48:4440 {
session user disabled
}
167.69.97.91:4440 {}
}
修改强>
使用其他答案,但是像这样:
$membersStr = @" members {
167.69.97.48:4440 {
session user disabled
}
167.69.97.91:4440 {}
}";
preg_match_all('/\d+\.\d+\.\d+\.\d+/', $membersStr, $nodesArray);
foreach ($nodesArray[0] as $ip)
echo $ip . "<br/>";
答案 1 :(得分:0)
如果使用现有的正则表达式进行拆分,则匹配的部分肯定不会成为结果列表的一部分。相反,你会得到空的空间,并填补其中的东西。
因此,如果您匹配并提取您真正想要的部分,则更简单:
preg_match_all('/\d+\.\d+\.\d+\.\d+/', $str, $matches);
$list = $matches[0];