2012-10-06 27 views
2

我目前正在尋找一種解決方案,我可以用它來找出所選的IP地址是否在一個字符串內,用專用替代它們。我的問題是,我不只是要取代總是相同的IP,但範圍。尋找建議更改IP地址顯示 - 可能與正則表達式?

例如,我想找出一個字符串中包含有123開始,如果是的話,更改IP地址,以字私人

例如一個IP:

123.55.33.10 
123.100.10.110 
123.1.5.1 

問題是,我不知道確切的IP地址,只知道他們是如何啓動的,所以我不能通過檢查字符串長度等來檢查他們。

接下來的問題是我想替換各種IP的,例如第一個一開始是123,然後是一些以66開頭的,等等。因此,對於我的問題,這將是巨大的,如果你能幫助我想出,基本上像一個解決方案:

$ips = array("123.","66.","112."); 

和解決方案將基本檢查,如果字符串包含數組的一個值,然後更換字私人的IP - 但不僅僅是123,但任何可能的組合成一個整體,這意味着不只是$string = str_replace("123.","",$string);

私人

原因更換整個IP地址,該R equest: 我正在爲學校建立一個小腳本,我需要用專用替換IP,因爲搜索功能會返回帶有IP地址的結果,而且我不想在結果中顯示它們。

該字符串可能看起來像: 漢斯IP 123.1.1.1在2012年10月12日

張貼所以,我的任務是顯示: 漢斯IP 私人張貼在2012年10月12日

所以要總結一下,無論字符串是否是: Hans在10.12.2012上發佈了IP 123.112.12.1或 Hans在10.12.2012上發佈了IP 123.12.15.12或 Hans於10.12.2012上發佈了IP 123.24.0.100

解決方案將取代任何IP的,與價值開始從我的陣列字私人

感謝您抽出時間閱讀本:)

編輯:

我這個嘗試的解決方案字符串,但它並沒有達到預期效果:

<?php 
$ip = "The date is 12.10.2012 and this ip 123.1.2.12 should not show but 144.100.1.11 should show while 66.122.11.9 should not show"; 
$ip = preg_replace('/^(123 | 66 | 112) \. [\d.]+$/x', "private", $ip); 
echo $ip; 
?> 

什麼到底應該顯示爲:

日期是12.10.2012,這個IP 私人不應該顯示,但144。100.1.11應該顯示而私人不應該顯示

+0

首先'explode' +'in_array' =解決方案。 – hakre

回答

1
$result = preg_replace(
    '/\b    # Start at a word boundary 
    (?=    # Assert that the following can be matched: 
    [^\d.]*   # only digits or dots 
    \b    # followed by a word boundary, 
    (?:123|66|112) # then one of the three magic numbers 
    \b    # and another word boundary 
    )    # End of lookahead 
    \d{1,3}   # Match a number 
    (?:\.\d{1,3}){3} # Match a dot and a number, three times 
    \b    # End the match at a word boundary/x', 
    'private', $subject); 

這不會對IPv4地址的有效性進行完整性檢查;它也會匹配999.123.999.999。但是如果需要的話,可以很容易地引入該檢查。

+0

這真是一段很棒的代碼。非常感謝你評論它,因爲它有助於理解它。畢竟我的使命是從代碼中學習,而不是僅僅複製它。再次感謝! –

0

你可能有興趣瞭解explodein_array

$private_ips = ["123", "66", "112"]; 

in_array(explode('.', $ip)[0], $private_ips) 
    && $ip = 'private' 
    ; 

echo $ip; 
0

它也可能使用一個正則表達式,併爲一個單班輪當然。

$ip = preg_replace('/^(123 | 66 | 112) \. [\d.]+$/x', "private", $ip); 

雖然正則表達式的第一個數字只是相比較,它還可以與[\d.]+匹配您的IP字符串的其餘部分,因而,如果更換的一切。