2016-12-19 2 views
1

Я пытаюсь создать замену preg для чисел в моем скрипте.php preg replace numbers

Давайте этот пример:

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 проблема.

Проблема, которую я нашел несколько дней назад, что если в источнике у меня есть связь с большим количеством цифр, например, ссылка facebook

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

Хорошо, вы хотите только совпадение внутри пробелов? Используйте '' ~ (?

+0

Да, теперь это работает хорошо! Благодаря! – Xander

Смежные вопросы