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

时间:2013-02-21 17:47:11

标签: php mysql regex

我目前在我的图片网站上有一个喜欢的功能,它将数据库中的用户IP存储在唯一的$ imgids中。

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

所以给定字符串“109.181.156.221”,数字最多为12个字节,每个小数点数为+ 3个字节...所以15个字节* 5000个IP * 10个图像ID = 7.1 Mb

Versus 32bit 109181156221,4个字节* 5000个IP * 100个图像ID = 2 Mb

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

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

所以我的问题是:

  

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

     

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

     

3)如果我正在尝试阅读它,我能将其转换回来吗?

有什么想法吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

答案 2 :(得分:2)

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

使用long2ip()进行解码。

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

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

答案 3 :(得分:0)

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

filter_var('109.181.156.221', FILTER_SANITIZE_NUMBER_INT);

会给你 109181156221

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

我会用点存储它。