Проверка 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, время: 10:26. |