我正在用PHP编写一个IRC机器人,并尝试将以下通知拆分为多个部分。
:irc.server.com NOTICE PHPServ :*** CONNECT: Client connecting on port 6667 (class users): Guest!Guest@127.0.0.1 (127.0.0.1) [Guest]<br />
到目前为止,我正在使用:
while(1) {
while($data = fgets($socket)) {
echo nl2br($data);
flush();
$ex = explode(' ', $data);
if($ex[0] == "PING"){
fputs($socket, "PONG ".$ex[1]."\n");
}
if($ex[1] == "NOTICE"){
if($ex[6] == "connecting"){
$userstring = $ex[12];
$usernick = strstr($userstring, '!', true);
$userip = strstr($userstring, '@');
}
}
}
}
?>
所以$user.nick
工作正常但$user.ip
包含@和IP地址。为什么这包括@但昵称不包括!?
另外,如何获得$user.ident
之间的差异!和@?
答案 0 :(得分:1)
尝试:
$userParts = explode('@', $userstring);
$userip = end($userParts);
答案 1 :(得分:0)
原因是包括'@'是因为(来源:http://php.net/strstr):
从包含第一个的开始返回haystack字符串的一部分 在大海捞针结束时出现针。
要解决此问题,您可以使用以下子字符串:
$userstring = $ex[12];
$exPos = strpos($userstring, '!');
$atPos = strpos($userstring, '@');
$usernick = strstr($userstring, '!', true);
$userip = substr($userstring, $atPos + 1);
$userident = substr($userstring, ($exPos + 1), ($atPos - $exPos) - 1);
我离开了第一个strstr,因为它比子串调用更容易阅读/理解。