как обнаружить телефонные номера в тексте (и заменить их)? - PullRequest
11 голосов
/ 22 сентября 2010

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

Ответы [ 4 ]

6 голосов
/ 22 сентября 2010

Добро пожаловать в мир регулярных выражений.По сути, вы захотите использовать 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+ чисел, что может быть нежелательно!

0 голосов
/ 09 июля 2017

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

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

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

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

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

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

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

0 голосов
/ 22 сентября 2010

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

Шаблон, соответствующий приведенному вами примеру, может быть '/ \ d {3} - \ d {3} \ d {4} /'

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

Вы могли бы также рассмотреть поиск слов, таких как моб, сотовый или телефон рядом с номером.

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

Ian

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

0 голосов
/ 22 сентября 2010

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

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

<?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, где вы можете даже протестировать его онлайн Это отличный инструмент для проверки регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...