Как определить номера телефонов в тексте (и заменить их)?

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

рядом с ним понадобится какая-то умеренность, но мне было интересно, есть ли способ заблокировать хотя бы очевидное, как nnn-nnn-nnnn, не прося блокировать другой странный способ писать, как HeiGHT*/four*/nine и т.д....

Ответ 1

Добро пожаловать в мир регулярных выражений. В основном вы захотите использовать preg_replace для поиска (некоторый шаблон) и заменить на строку.

Здесь что-то для начала:

$text = preg_replace('/\+?[0-9][0-9()\-\s+]{4,20}[0-9]/', '[blocked]', $text);

это ищет:

символ плюс (необязательно), за которым следует число, за которым следуют 4-20 номеров, скобки, тире или пробелы, а затем число

и заменяет строку [заблокирована].

Это захватывает все очевидные комбинации, о которых я могу думать:

012345 123123
+44 1234 123123
+44(0)123 123123
0123456789
Placename 123456 (although this one will leave 'Placename')

однако он также лишит любую последовательность из 6 + чисел, что может быть нежелательно!

Ответ 2

Для этого вы должны использовать регулярные выражения, как вы знаете.

Я нашел этот шаблон, который может быть полезен для вашего проекта:

<?php
  preg_match("/(^(([\+]\d{1,3})?[ \.-]?[\(]?\d{3}[\)]?)?[ \.-]?\d{3}[ \.-]?\d{4}$)/", $yourText, $matches);
  //matches variable will contain the array of matched strings
?>   

Более подробную информацию об этом шаблоне можно найти здесь http://gskinner.com/RegExr/?2rirv, где вы можете даже проверить его в Интернете. Это отличный инструмент для проверки регулярных выражений.

Ответ 3

preg_match ($ pattern, $subject) вернет 1 (true), если шаблон найден у субъекта и 0 (false) в противном случае.

Образец, соответствующий вашему примеру, может быть '/\ d {3} -\d {3}\d {4}/'

Однако все, что вы выбрали для своего шаблона, будет страдать как от ложных срабатываний, так и от ложных негативов.

Вы также можете рассмотреть поиск таких слов, как mob, cell или tel рядом с номером.

Детали заполнения сопоставления шаблонов php можно найти на http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

Ян

p.s. Это не может быть сделано для плохих слов, как скажут вам люди в Сканторпе.

Ответ 4

Я думаю, что использование слишком жесткого регулярного эссе может привести к большому количеству обнаружений.

Вы должны проверить части из 10 последовательных символов, содержащих более 5 цифр.

Итак, похоже, что у вас будет процедура analisys, которая будет вызываться после любой вставки сообщения из-за вычислительного веса.

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

Затем вы также можете изучать свои пользовательские данные для создания более сложных эвристик, таких как нечувствительные к регистру числа, написанные как буквы, смешанные, разделенные точкой и т.д.

Это не о написании наиболее совершенного регулярного выражения, а о приближении к проблеме статистически и динамически.

И помните, что после того, как вы предпримете действие, пользователь изменит свои привычки вставки как следствие, поэтому статистика изменится, и вам нужно будет изучить и обновить свои эвристики.