[英]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_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
$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.