Как я могу обнаружить (с регулярными выражениями или эвристиками) ссылку на веб-сайт в строке текста, например комментария?
Целью является предотвращение спама. HTML лишен, поэтому мне нужно обнаружить приглашения для копирования и вставки. Для спамера не должно быть экономичным размещать ссылки, потому что большинство пользователей не смогли успешно попасть на страницу. Я хотел бы предложения, ссылки или обсуждение лучших практик.
Некоторые цели:
- Низко висящие фрукты, как хорошо сформированные URL-адреса (
http://some-fqdn/some/valid/path.ext
) - но без префикса
http://
(т.е. допустимого FQDN + допустимого HTTP-пути) - Любые другие забавные дела.
Конечно, я блокирую спам, но тот же процесс можно использовать для автоматической привязки текста.
Идеи
Вот некоторые вещи, о которых я думаю.
- Содержимое - это проза на родном языке, поэтому я могу быть счастливым в обнаружении
- Должен ли я сначала удалить все пробелы, чтобы поймать "
www .example.com
"? Общеизвестные пользователи знают, чтобы удалить пространство самостоятельно или сделать какие-либо браузеры "делать-то-я-значит" и лишить его для вас? - Может быть, несколько проходов - лучшая стратегия, с проверкой на:
- Хорошо сформированные URL-адреса
- Все не-пробелы, за которыми следует '.' за которым следует любой действительный TLD
- Что-нибудь еще?
Вопросы, относящиеся
Я прочитал их, и теперь они задокументированы здесь, поэтому вы можете просто ссылаться на регулярные выражения по этим вопросам, если хотите.
- заменить URL с помощью HTML-ссылок javascript
- Что является лучшим регулярным выражением, чтобы проверить правильность строки?
- Получение частей URL (Regex)
Обновление и сводка
Ничего себе, у меня есть очень хорошие эвристики, перечисленные здесь! Для меня лучший удар для доллара - это синтез следующего:
- @Jon Яркая методика обнаружения TLD (хороший защитный chokepoint)
- Для этих подозрительных строк замените точку точкой-символом в соответствии с параметром @capar
- Хороший точечный символ - @Sharkey subscripted & amidd; middot; (т.е. " & middot;" ). & Амп; Мидот; также является границей слов, поэтому сложнее случайно скопировать и вставить.
Это должно сделать CPM спамера достаточно низким для моих нужд; "неправильный" пользовательский отзыв должен поймать что-нибудь еще. Другие перечисленные решения также очень полезны:
- Разделите все пунктирные квадратики (комментарий @Sharkey к его собственному ответу)
- Требование @Sporkmonger для клиентского Javascript, который вставляет необходимое скрытое поле в форму.
- Отправка URL-адреса сервера, чтобы определить, является ли это веб-сайтом. (Возможно, я мог бы запустить HTML через SpamAssassin или другой байесовский фильтр в соответствии с @Nathan..)
- Глядя на источник Chrome для своей интеллектуальной адресной строки, чтобы узнать, какие умные трюки Google использует
- Вызов OWASP AntiSAMY или других веб-сервисов для обнаружения спама и вредоносного ПО.