2016-12-19 127 views
1

我想在我的腳本中爲數字構建preg替換。php preg替換數字

讓我們有這樣的例子:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Integer lobortis luctus scelerisque. Curabitur 3214567890 dignissim finibus felis, 
vitae vehicula ipsum vehicula a. 
Maecenas tincidunt et metus vitae eleifend. Cras tellus eros, placerat 
https://www.facebook.com/groups/123456789123456789/ 

我必須找到一個數字,它是在一個文本源寫的99%,3開始,它具有10位數字。

我寫了這個簡單的preg_replace

preg_replace('/3[0-9]{6}([0-9]{3})/e', '"Number" . md5("$0") . " " . "["."$1"."]"', data) 

,因爲我需要更換使用MD5這個數字並寫入最後3個位數。

例如,如果我有我3214567890需要得到

Number89467086c22e2cee9aae8dbf9c7f7453 [890] 

這preg_replace函數所做的工作,但它有1個問題。

,我發現前幾天的問題是,如果在源我有一個批號的鏈接,例如,一個網站鏈接

https://www.facebook.com/groups/123456789123456789/ 

的preg_replace闡述它也並更換該鏈接的號碼,但我不需要觸摸鏈接,我只需要轉換分離的數字。

任何人都可以幫助我嗎?

+0

你嘗試加入\ s?如果所有數字都使用空格字符與其他文本分開,則可能有效。 – birraa

回答

2

您可以使用單詞邊界\b

'~\b3[0-9]{6}([0-9]{3})\b~' 

或lookarounds (?<!\d)(?!\d)(只匹配,如果不與其他數字附後):

'~(?<!\d)3[0-9]{6}([0-9]{3})(?!\d)~' 

或者,如果您只想比賽數字時空格符號中,使用

'~(?<!\S)3[0-9]{6}([0-9]{3})(?!\S)~' 

然後,裏面的代碼,你最好使用preg_replace_callback因爲/e修正已過時:

preg_replace_callback('~(?<!\d)3[0-9]{6}([0-9]{3})(?!\d)~', function($m) { 
    return 'Number' . md5($m[0]) . ' [' . $m[1] . ']'; 
    }, data); 
+0

它的工作原理,但我發現另一個問題:它轉換,如果它發現像這樣的鏈接:http://www.domain.com/Page/?num=3711436157 – Xander

+0

好吧,你想只匹配內部空格?使用''〜(?<!\ S)3 [0-9] {6}([0-9] {3})(?!\ S)〜'' –

+0

是的,現在看起來效果不錯!謝謝! – Xander