Проверка textarea на запрет ввода элементов ссылки
Приветствую!
На странице есть форма отправки сообщений. На сервере добавил проверку вводимого содержания на наличие элементов ссылки и все элементы ссылок или названия доменных имен вырезаются. Если сообщение содержало только ссылку, то сохраняется пустое сообщение, что не есть хорошо. Для PHP использую выражение: $exge = '@((https?://)?([-\\w]+\\.[-\\w\\.]+)+\\w(:\\d+)?(/([-\\w/_\\.]*(\\?\\S+)?)?)*)(?:[?&][^?$]+=[^?&]*)*@i'; Хотелось бы, что бы выражение можно было переписать под использование в скрипте. Это выражение очень хорошо режет любые варианты ссылок и названия доменных имен. Нужно сделать проверку формы скриптом на странице, на содержание элементов ссылки и если такие элементы есть в поле textarea, тогда выводить сообщение "Ссылки запрещены" и сообщение не должно отправляться. Сейчас на странице есть скрипт, который проверяет количество вводимых символов, подсчитывает их и если символов 0 или больше 200, тогда выводит под формой в dstype="error_msg" сообщение "Вы не указали вопрос" или "Вопрос не должен превышать 200 символов" и сообщение не отправляется. Это правильно. Если ошибок в форме нет, тогда сообщение должно отправляться. Нужно, чтобы сообщение "Ссылки запрещены" выводилось в том же dstype="error_msg", если это не будет мешать выводу других сообщений об ошибке количества символов. Заранее спасибо, откликнувшимся! <form method="post" id="save_consult_form2" action='goods/save_consult'> <div class="comment-add"><textarea id="textfield3" name="content" type="text"></textarea></div> <div class="comment-act"> <a href="JavaScript:void(0);" dstype="consult_submit" class="dss-btn">Отправить</a> </div> <span id="consultcharcount"></span> <span dstype="error_msg"></span> </form> $(function () { $('a[dstype="consult_submit"]').click(function () { $('#save_consult_form2').submit(); }); $('#save_consult_form2').validate({ errorPlacement: function (error, element) { $('span[dstype="error_msg"]').append(error); }, submitHandler: function (form) { ds_ajaxpost('save_consult_form2'); }, onkeyup: false, rules: { content: { required: true, maxlength: 200 } }, messages : { content : { required : 'Вы не указали вопрос', maxlength:'Вопрос не должен превышать 200 символов.' } } }); // textarea подсчет символов $("#textfield3").charCount({ allowed: 200, warning: 10, counterContainerID: 'consultcharcount', firstCounterText: 'Вы можете ввести ещё до', endCounterText: 'символов.', errorCounterText: 'Текст вопроса превышен на' }); }); |
Vaska,
искать по форуму или документации $.validator.addMethod смотреть примеры. |
validate запрет ссылок
Vaska,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.min.js"></script> <script> $(function() { $('a[dstype="consult_submit"]').click(function() { $('#save_consult_form2').submit(); }); $.validator.addMethod('removeLink', function(value, element) { return !/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|(www\.)?[a-zA-Z0-9]+\.[^\s]{2,})/i.test(value) }, 'Ссылки запрещены'); $('#save_consult_form2').validate({ errorPlacement: function(error, element) { $('span[dstype="error_msg"]').append(error); }, submitHandler: function(form) { ds_ajaxpost('save_consult_form2'); }, onkeyup: false, rules: { content: { required: true, maxlength: 200, removeLink: true } }, messages: { content: { required: 'Вы не указали вопрос', maxlength: 'Вопрос не должен превышать 200 символов.' } } }); }); </script> </head> <body> <form method="post" id="save_consult_form2" action='goods/save_consult'> <div class="comment-add"><textarea id="textfield3" name="content" type="text"></textarea></div> <div class="comment-act"> <a href="JavaScript:void(0);" dstype="consult_submit" class="dss-btn">Отправить</a> </div> <span id="consultcharcount"></span> <span dstype="error_msg"></span> </form> </body> </html> |
рони,спасибо, за помощь!
В целом скрипт работает, как я хотел. Но есть проблема в выражении. Переписанное выражение, для скрипта, не видит название домена, как ошибку, в тексте, например javascript.ru и пропускает его для отправки сообщения. Выражение для PHP видит название домена и вырезает его при записи в базу данных. Можете пересмотреть выражение и поправить его для скрипта правильно? |
Цитата:
|
рони,
Сейчас работает. Спасибо, за помощь! |
рони,
Можно ли добавить в ваше регулярное выражение условие: кроме ссылок содержащих доменное имя javascript.ru, или содержащее доменное имя subdomain.javascript.ru? Я посмотрел в интернете, но такую конструкцию я сам не осилил добавить. |
запрет ссылок кроме содержащих javascript.ru
Vaska,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.2/jquery.validate.min.js"></script> <script> $(function() { $('a[dstype="consult_submit"]').click(function() { $('#save_consult_form2').submit(); }); $.validator.addMethod('removeLink', function(value, element) { let reg = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|(www\.)?[a-zA-Z0-9]+\.[^\s]{2,})/mig let match = value.match(reg); return !match || match.every(link => link.includes('javascript.ru')) }, 'Сообщение содержит запрещённые ссылки'); $('#save_consult_form2').validate({ errorPlacement: function(error, element) { $('span[dstype="error_msg"]').append(error); }, submitHandler: function(form) { ds_ajaxpost('save_consult_form2'); }, onkeyup: false, rules: { content: { required: true, maxlength: 200, removeLink: true } }, messages: { content: { required: 'Вы не указали вопрос', maxlength: 'Вопрос не должен превышать 200 символов.' } } }); }); </script> </head> <body> <form method="post" id="save_consult_form2" action='goods/save_consult'> <div class="comment-add"><textarea id="textfield3" name="content" type="text" rows="10" cols="70"> javascript.ru https://cdnjs.cloudflare.com/ajax //для теста удалить эту строку https://www.javascript.ru </textarea></div> <div class="comment-act"> <a href="JavaScript:void(0);" dstype="consult_submit" class="dss-btn">Отправить</a> </div> <span id="consultcharcount"></span> <span dstype="error_msg"></span> </form> </body> </html> |
рони,
с тестовым содержимым формы выражение правильно отрабатывает. Однако, если удалить всё содержимое, оставить только javascript.ru, нажать кнопку "Отправить", далее изменить javascript.ru на sjavascript.ru - тогда разрешает стороннему домену пройти проверку и сообщение отправляется. Это неправильно. |
Vaska,
запрет ссылок кроме содержащих javascript.ru |
Часовой пояс GMT +3, время: 12:55. |