Я знаю, что это можно сделать для плохих слов (проверка массива заданных слов), но как определить номера телефонов в длинном тексте? Я создаю веб-сайт в PHP для клиента, которому нужно избегать людей, использующих поле описания, для размещения своих номеров мобильных телефонов .. (см. Craigslist и т. Д.).
кроме того, он будет нуждаться в некоторой модерации, но мне было интересно, есть ли способ блокировать, по крайней мере, очевидное, как nnn-nnn-nnnn
, не прося блокировать другой странный способ писать, как HeiGHT*/four*/nine
т. д. …
Добро пожаловать в мир регулярных выражений. В основном вы захотите использовать 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 + чисел, что может быть нежелательно!
Для этого вы должны использовать регулярные выражения, как вы, возможно, знаете.
Я нашел этот шаблон, который может быть полезен для вашего проекта:
<?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, где вы можете даже проверить его в Интернете. Это отличный инструмент для проверки регулярных выражений.
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.
Ян
ps Это не может быть сделано для плохих слов, как скажут вам люди в Сканторпе.
Я думаю, что использование слишком жесткого регулярного эзиса приведет к большому количеству обнаружений.
Вы должны проверить части из 10 последовательных символов, содержащих более 5 цифр.
Таким образом, похоже, что у вас будет процедура analisys, которая будет вызываться после любой вставки сообщения из-за вычислительного веса.
После того, как выделены 6 или более цифр, замените их по своему усмотрению, включая другие цифры syblings. Лучше в любом случае сохранить исходные данные, чтобы вы могли попробовать и подготовить свой алгоритм обнаружения до тех пор, пока он не будет работать наилучшим образом.
Затем вы также можете изучать свои пользовательские данные для создания более сложных эвристик, таких как нечувствительные к регистру числа, написанные как буквы, смешанные, разделенные точкой и т. Д. …
Дело не в написании самого совершенного регулярного выражения, а в приближении к проблеме статистически и динамически.
И помните, что после того, как вы предпримете действие, пользователь изменит свои привычки вставки как следствие, поэтому статистика изменится, и вам нужно будет изучить и обновить свою эвристику.