2016-02-20 3 views
2

Я пытаюсь удалить/определить номера телефонов из сообщений между пользователями моего веб-сайта торговой площадки (думаю, что eBay делает что-то подобное) это код, я использую:Php: как удалить номера телефонов из строки?

$string = preg_replace('/([0-9]+[\- ]?[0-9]+)/', '', $string); 

НО ... это слишком агрессивный, и он удаляет любое число с двумя или более цифрами ... как можно установить предел, например, 7 чисел?

точнее телефонные номера могут быть в любом формате, как

3747657654 
374-7657654 
374-765-7654 
(374)765-7654 
etc...(i cannot predict what the users will write depending of their habits) 
+1

Без какой-либо идеи из строка, которую вы пытаетесь определить номер телефона, мы не можем много помочь. Добавьте образец (ы) к вашему вопросу – RiggsFolly

+0

любой номер телефона в мире, написанный человеком: либо последовательность из 7, либо более номеров, по возможности, телефон отформатирован в западных странах. я не могу предсказать, что будут писать пользователи – Francesco

+1

'Я не могу предсказать, что пользователи будут писать в зависимости от их привычек' Как вы узнаете разницу между 7-значным телефоном № и 7-значными деньгами e.г. '1234567'? – anubhava

ответ

0

Это будет зависеть от конкретных требований, как теперь у вас есть 1 или несколько чисел с последующим дополнительным - или пространства, а затем 1 или более цифры снова.

Если вы хотите, например, по меньшей мере, 2 номера перед пробелом или - следуют, по крайней мере, 5 номеров, вы могли бы использовать что-то вроде:

$string = preg_replace('/([0-9]{2,}[\- ]?[0-9]{5,})/', '', $string); 
               ^^^^ Here you can specify mininimum/maximum 
           ^^^^ Here you can specify mininimum/maximum 
0

Вы можете попробовать что-то вроде этого:

$string = preg_replace('/(?<![0-9]|[0-9]-)[0-9](?:[- ]?[0-9]){6}(?!-?[0-9])/', '', $string); 

Образцы здесь, чтобы избежать чисел с более чем 7 цифрами, но если вы хотите что-то более конкретное, вы должны предоставить пример строки.

1

Попробуйте это регулярное выражение:

/([0-9]+[\- ]?[0-9]{6,})/

изменен в соответствии с вашими образцы: Regex101

+0

да, это так, но также ti удаляет любое число, например, метку времени, например. «Эй, я увижу тебя там с 4 вечера до 8, моя камера 3747657654» – Francesco

0

невозможно определить, является ли число X цифр (где X является допустимым телефон длина номера) - это номер телефона или что-то еще без какого-либо контекстного интеллекта. Простое регулярное выражение не может определить разницу между «позвоните мне по телефону 3453456» и «Назовите меня, когда вы пролетели 3453456 миль».

Поэтому попытка уловить номера телефонов без форматирования (только прямые цифры) с помощью регулярного выражения является безнадежной, чистой и простой. Попытка сделать это только удерживает вас от поиска регулярного выражения, которое может найти отформатированные/полуформатные номера. То, что вы должны здесь делать, - «получить очевидное и максимально возможное количество других с минимальными ложными срабатываниями ... но признать, что я не могу их всех».

Для этого я рекомендовал бы это:

/1?[ \-]?\(?([0-9]{3})?\)?[ \-]?([0-9]{3})[ \-]([0-9]{4})/g

Он не должен получить первые три, но получить все остальное в этом списке:

no-match: 3747657654 
no-match: 444444444444444 
no-match: 7657654 
match: 374-765-7654 
match: 1-374-765-7654 
match: (374)765-7654 
match: (374) 765 7654 
match: 765-7654 
match: 1 (374) 765 7654 
match: 1(374)765 7654 
Смежные вопросы