Как я могу обнаружить (с помощью регулярных выражений или эвристики) ссылку на веб-сайт в строке текста, например в комментарии?
Цель - предотвратить спам. HTML лишен, поэтому мне нужно обнаружить приглашения для копирования и вставки. Размещение ссылок для спамера не должно быть экономичным, поскольку большинство пользователей не могут успешно перейти на страницу. Мне нужны предложения, ссылки или обсуждение передового опыта.
Некоторые цели:
- Низко висящие плоды, такие как правильно сформированные URL-адреса (
http://some-fqdn/some/valid/path.ext
) - URL-адреса, но без префикса
http://
(т.е. действительное полное доменное имя + действительный путь HTTP) - Любой другой забавный бизнес
Конечно, я блокирую спам, но тот же процесс можно использовать для автоматической ссылки на текст.
Идеи
Вот некоторые вещи, о которых я думаю.
- Контент - это проза на родном языке, поэтому я могу легко обнаружить
- Должен ли я сначала удалить все пробелы, чтобы поймать "
www .example.com
"? Знают ли обычные пользователи, что нужно удалить пробел сами, или какие-нибудь браузеры «делают то, что я имею в виду» и удаляют его за вас? - Maybe multiple passes is a better strategy, with scans for:
- Well-formed URLs
- Все без пробелов, за которыми следует '.' за которым следует любой действующий TLD
- Что-нибудь еще?
Связанные вопросы
Я прочитал их, и теперь они задокументированы здесь, так что вы можете просто ссылаться на регулярные выражения в этих вопросах, если хотите.
- замените URL-адрес на HTML-ссылки javascript
- Что такое лучшее регулярное выражение, чтобы проверить, является ли строка действительным URL-адресом
- Получение частей URL-адреса (регулярное выражение)
Обновление и резюме
Вау, здесь есть несколько очень хороших эвристик! Для меня лучшая рентабельность - это синтез следующего:
- Техника @Jon Bright по обнаружению TLD (хороший защитный проход)
- Для этих подозрительных строк замените точку символом точки в соответствии с @capar
- Хороший точечный символ - это нижний индекс @Sharkey (т. Е. ""). также является границей слова, поэтому его сложнее случайно скопировать и вставить.
Это должно сделать CPM спамера достаточно низким для моих нужд; отзыв пользователя «пометить как неприемлемый» должен улавливать что-то еще. Другие перечисленные решения также очень полезны:
- Вычеркните все квадраты с точками (комментарий @Sharkey к его собственному ответу)
- Требование @ Sporkmonger к клиентскому Javascript, который вставляет обязательное скрытое поле в форму.
- Проверка связи URL-адреса на стороне сервера, чтобы определить, является ли это веб-сайтом. (Возможно, я смогу запустить HTML через SpamAssassin или другой байесовский фильтр согласно @Nathan ..)
- Взгляните на исходный код Chrome для его умной адресной строки, чтобы узнать, какие хитрые уловки использует Google
- Обращение к OWASP AntiSAMY или другим веб-службам для обнаружения спама / вредоносных программ.