2011-03-07 33 views
0

我想使用正則表達式的問題是,星號(*)必須的長度相匹配,以隱藏IP地址的最後兩節的IP地址(字符串)這些部分。如何掩蓋/隱藏,使用PHP和正則表達式

如:10.101.12.100應該被重新格式化成10.101.**.***

這是我的工作代碼:

echo preg_replace('!(\d+).(\d+).\d+.\d+!s', '${1}.${2}.***.***', "10.101.12.100"); 
// Return: 10.101.***.*** 

這是可能的使用正則表達式?

PS:我知道我可以使用explode('.', ...)str_repeat('*', strlen(...))一起打破它,但我覺得preg_replace一個清晰的解決方案。我正在尋找「oneliner」解決方案。

+0

只有具有一個自定義的回調函數。然後我猜'exlode'版本更容易....爲什麼它總是必須是一行?你應該把它放在一個函數中,然後你有一個「oneliner」。 –

+0

@Felix,自定義回調可能是一個解決方案。好吧,它不是一個班輪,但它可能是一個'爆炸'解決方案更清潔。 – Cybrix

+0

@Cybrix:開玩笑,我會說,你必須有「乾淨」 :) –

回答

6

使用負向前瞻(基本上,有正則表達式取消前兩個字節的資格,然後從其後進行正常的數字替換。

(?!\d{1,3}\.\d{1,3}\.)\d 

Demo

輸出示例:

237.134.85.92 -> 237.134.**.** 
173.14.176.182 -> 173.14.***.*** 
167.209.41.203 -> 167.209.**.*** 
137.133.204.130 -> 137.133.***.*** 
93.108.72.157 -> 93.108.**.*** 
+0

+1非常好:) –

+0

謝謝。您提供了一個單線解決方案。 'echo preg_replace('/(?!\ d {1,3} \。\ d {1,3} \。)\ d /','*',「10.101.12.100」); // Return:10.101。**。***' – Cybrix

+0

@ FelixKling:謝謝,每隔一段時間我都會拉一個人。 ;-) - @Cybrix:沒問題。如果這樣做不起作用,我已經爲create_function/eval解決方案做好了充分的準備...... [不是真的]。 –

0

這可能是一個有點正則表達式的濫用。以下內容可能更快,更安全,更易於理解......

  1. 將字符串爆炸爲「。」。
  2. 有「*」
  3. 加入與替換數組索引2,3所有字符「」
  4. 贏利。
+0

感謝您的回答。那是我已經使用的解決方案,但我只是想知道是否可以使用正則表達式解決方案。 – Cybrix