2016-12-19 175 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