簡體   English   中英

PHP:使用正則表達式從IP地址中刪除小數

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

我目前在我的圖像站點上有一個喜歡的功能,它將數據庫中的用戶IP存儲在唯一的$ imgids中。

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)如果我想讀它,我能將它轉換回來嗎?

有什么想法嗎?

謝謝!

你可以使用ip2long (),然后它應該適合unsigned int列。

有不同的方法來做到這一點:

正確的方式:

讓數據庫為您進行轉換。 您必須將IP作為INT(10) UNSIGNED存儲在數據庫中,並使用INET_ATONINET_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()函數存儲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形式。

我會用點存儲它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM