Как определить номера телефонов в тексте (и заменить их)?
Я знаю, что это можно сделать для плохих слов (проверка массива заданных слов), но как определить номера телефонов в длинном тексте?
Я создаю веб-сайт в 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.
Лучше в любом случае сохранить исходные данные, чтобы вы могли попробовать и подготовить свой алгоритм обнаружения до тех пор, пока он не будет работать наилучшим образом.
Затем вы также можете изучать свои пользовательские данные для создания более сложных эвристик, таких как нечувствительные к регистру числа, написанные как буквы, смешанные, разделенные точкой и т.д.
Это не о написании наиболее совершенного регулярного выражения, а о приближении к проблеме статистически и динамически.
И помните, что после того, как вы предпримете действие, пользователь изменит свои привычки вставки как следствие, поэтому статистика изменится, и вам нужно будет изучить и обновить свои эвристики.