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