PHP:使用正则表达式删除IP地址中的小数


PHP: Using a regex to remove decimals out of IP address

我目前在我的图片网站上有一个点赞功能,可以根据唯一的$imgid将用户IP存储在数据库中。

IP当前存储为字符串。为了节省空间,我不想将IP存储为带小数点的字符串,而是存储为32位整数(字符串中每个整数1位,每个字符1字节)。我认为这可以节省相当大的空间,因为我有潜力让n个独特的IP喜欢x个图像。。。

因此,给定字符串"109.181-156.221",数字的最大值为12个字节,每个小数点+3个字节。。。因此15字节*5000 IP*10图像ID=7.1 Mb

与32位109181156221相比,4字节*5000 IP*100图像ID=2 Mb

所以,在插入IP之前,我想使用正则表达式删除小数,然后将IP存储为数字。。。"109.181-156.221"->109181156221我是Regexs的新手,但我已经尝试过了,但它不起作用:

$ipINT = preg_replaceAll("''.+$", "" , $ipString);

所以我的问题是:

1) 在Mysql数据库中节省空间是否重要?这是吗值得麻烦吗?

2) 我的正则表达式在哪里?

3) 如果我试着读它,我能把它转换回来吗?

有什么想法吗?

谢谢!

有不同的方法可以做到这一点:

正确的方式:

通过让数据库为您进行转换。您必须将ip作为INT(10) UNSIGNED存储在数据库中,并使用INET_ATON&INET_NTOA:

SELECT INET_ATON("109.181.156.221"); // result 1840618717
SELECT INET_NTOA("1840618717"); // result 109.181.156.221

替代方式:

通过使用PHP内部函数ip2long()&long2ip(),然后将其存储在DB:中

$ipINT = ip2long('109.181.156.221'); // result 1840618717
$ip = long2ip('1840618717'); // result 109.181.156.221

非标准方式:

通过删除点并添加"0"(如果需要),可以将其转换回:

function ip2int($ip){
  $chunks = explode(".", $ip);
  $int = '';
  foreach($chunks as $chunk){
    $int .= str_pad($chunk, 3, '0', STR_PAD_LEFT);
  }
  return $int;
}
function int2ip($int){
  $chunks = str_split($int, 3);
  $c = count($chunks);
  $ip = ltrim($chunks[0], '0');
  for($i=1;$i<$c;$i++){
    $ip .= '.' . ltrim($chunks[$i], '0');
  }
  return($ip);
}
echo ip2int("109.1.156.5") . '<br>'; // result 109001156005
echo int2ip("109001156005"); // result 109.1.156.5

修复您的RegEx:

$ip = "109.181.156.221";
$replace = preg_replace("/'./", "", $ip); // This will remove all the dots
echo $replace; // result 109181156221

您可以使用ip2long(),然后它应该适合无符号的int列。

使用ip2long()函数来存储IP地址-无符号INT(10)应该很棒。

使用long2ip()进行解码。

http://php.net/manual/en/function.ip2long.php

您的解决方案不适用于1.123.123.123这样的IP地址,因为您不知道在哪里恢复小数点。存储IP地址的正确方式是使用上述方法。

如果你只想提取不需要正则表达式的数字,你可以使用:

filter_var('109.181.156.221', FILTER_SANITIZE_NUMBER_INT);

将为您提供109181156221

但我认为你无法将其转换回IP形式。

我会用点来存储它。