Форум OlegON > Ресурсы OlegON > Вопросы сервера

Алгоритм поиска URL в сообщении : Вопросы сервера

22.11.2024 16:12


26.12.2014 14:07
Сейчас среди прочих недостатков форума есть препятствие для новичков, вставляющих сообщение об ошибке. Иногда срабатывает блокировка на проверку ссылок, хотя речь идет, например, о COM-объектах или еще что-то в этом роде.

Как это сделано сейчас: из сообщения вырезаются все вхождения вроде "https://olegon.ru", поскольку ссылки на форум и хранилище допустимы. После этого ищется http:// или .ru и .com. Тупо, но хорошо ловит. Иногда даже слишком хорошо.

Прошу идей, как можно сделать эту проверку поумнее. Если не разбираетесь в программировании - хотя бы просто алгоритм.

Пока есть мысли начать с preg_match
Код:
%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%
Соответственно, блокиратор не должен пускать, как ссылки, так и просто упоминания доменного имени, но разрешать вставлять ошибки (текст)... Вот тут меня плющит, поскольку все варианты ошибок я себе не представляю.
26.12.2014 14:12
Хотя бы насыпьте вариантов ошибок, которые могут быть закинуты на этот форум и восприниматься, как ссылки текущим алгоритмом.
26.12.2014 14:19
а что если проверять на правильность урл и если она не прошла - оставлять все :)

я как то пользовался проверкой от сюда (там правда для регексп)

URL Validator
http://regexlib.com/REDetails.aspx?regexp_id=1854&AspxAutoDetectCookieSupport=1
26.12.2014 15:04
Так я про preg_match потому и заговорил, что можно проверять, но как разделить .com в составе урла и в ошибке - пока идей нет...
Была идея проверять http, а все, что без него - проверять на доступность, типа, если по сети не отвечает, то все нормально... но пока не определился с этим... больно много доменов уже есть - ложные срабатывания будут.
26.12.2014 15:41
А в чём принципиальная проблема разрешить размещать ссылки? Новичкам - только неактивные. Просто применять правила на "общетекстовых" основаниях. Нарушил - получи наказание. В чём сермяжная суть непременно резать ссылки? Всё равно же если надо - разместят а-ля яндекс_точка_ру.
26.12.2014 16:46
С точки зрения спамера неактивные и активные ссылки - без разницы, кстати, активирует их форум, если видит http(s). А-ля в этом плане как раз безопасные, поскольку нужны очень малому количеству спамеров. Вплоть до того, что я "а-ля" руками правлю на нормальные, если они не ведут хз куда.

Вред ссылок в том, что они загоняют ресурс вниз по позициям поисковиков. Я уже несколько лет эти самые профуканные позиции не могу вернуть, учитывая, что на меня ссылки не ставит практически никто. Тот же гугл работает со ссылочной массой. Если с форума будет 200 ссылок НА другие ресурсы (ну, кроме, может, википедии) при отсутствии обратных, то любой другой ресурс такого же возраста, чистый от ссылок наружу, по определению выше в результатах выдачи. Если на тот ресурс есть входящие ссылки, то значительно выше, но это уже другое.

Еще беда в том, что свежезарегистрировавшийся может оставить мусор и я его буду чистить руками. Все же основная модераторская нагрузка на мне. Нетрудно проверить, что новый пишущий участник появляется в среднем раз в неделю. Среднее число ежедневно регистрирующихся - 5-7 человек. Внимание, вопрос, зачем они регистрируются, если разница только в возможности писать? Правильно... Они не могут писать, поскольку ссылку разместить не дает. Воевать с этой толпой желающих замусорить не хочется совсем. Превращать форум в помойку - тем более. Я уже вою от того, что ежедневно приходится переименовывать несколько тем и делить оффтопик в отдельные темы. Думаешь, все такие темы подробные создают? Если честно, немного подзадолбало, учитывая, что некоторые темы мне малоинтересны.

Отсюда и желание максимально автоматизировать. Как c юзерами, под админом же никто не работает, хотя да, можно прибежать потом, поругаться, шефу служебку накатать... Но проще - не дать сделать бяку.
26.12.2014 19:33
Цитата:
OlegON Так я про preg_match потому и заговорил, что можно проверять, но как разделить .com в составе урла и в ошибке - пока идей нет...
м.б. я чего то не догоняю :) но берешь строку от пробела до пробела - проверяешь на урл - подошла - режешь - нет - оставляешь . . .
правда шаблон для регепса придется несколько раз применять - один для стандартного урла, другие для всех возможных извратов - типа подчеркивание вместо точки, пробелы между группами и т. п.
либо перебором клеить строки (убирать пробелы между слов или заменять что то - на подходящее по смыслу) и проверять на павильность - прошла проверка - долой результат
но вероятнее всего предусмотреть все не прокатит, по крайней мере с первого раза

алгоритм муторный, но проверенный на практике, правда не на урл-ах :)
27.12.2014 08:29
сложность тут в "проверяешь на урл" :) сейчас это выглядит так
Цитата:
global $vbulletin;
$groups = explode(',','6,12,13,14,15,16');
if (!is_member_of($vbulletin->userinfo, $groups) OR $groups[0] == 0)
{
$pagetext = $this->fetch_field('pagetext','post');
$pagetext = str_ireplace('[url]https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url="https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url="https://storage.olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url]https://storage.olegon.ru','',$pagetext);
$pagetext = str_ireplace('https://storage.olegon.ru','',$pagetext);
if ((stristr($pagetext,'[url') or stristr($pagetext,'://') or stristr($pagetext,'[URL') or stristr($pagetext,'www.') or stristr($pagetext,'.ru') or stristr($pagetext,'.net') or stristr($pagetext,'.рф') or stristr($pagetext,'.com')))
{
$this->error('restrict_by_rules');
$return_value = false;
}
}
27.12.2014 09:41
Теперь выглядит так
Цитата:
global $vbulletin;
$groups = explode(',','6,12,13,14,15,16');
if (!is_member_of($vbulletin->userinfo, $groups) OR $groups[0] == 0)
{
$pagetext = $this->fetch_field('pagetext','post');
$pagetext = str_ireplace('[url]https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url="https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('https://olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url="https://storage.olegon.ru','',$pagetext);
$pagetext = str_ireplace('[url]https://storage.olegon.ru','',$pagetext);
$pagetext = str_ireplace('https://storage.olegon.ru','',$pagetext);
if (preg_match('%[a-zа-я0-9-@](\.|\s|dot|точка|\_)[a-zа-я]{2,3}(/|\s|$)%i',$pagetext)!=0)
{
$this->error('restrict_by_rules');
$return_value = false;
}
}
27.12.2014 09:53
суть поиска - символ, за которым идут точка, пробел, "dot", "точка" или знак подчеркивания, потом два или три символа, потом /, пробел или конец строки
логика, кмк, не нарушена?
Часовой пояс GMT +3, время: 16:12.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.