Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проверка textarea на запрет ввода элементов ссылки (https://javascript.ru/forum/dom-window/82455-proverka-textarea-na-zapret-vvoda-ehlementov-ssylki.html)

Vaska 10.05.2021 08:03

Проверка 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: 'Текст вопроса превышен на'
		});
	});

рони 10.05.2021 10:01

Vaska,
искать по форуму или документации $.validator.addMethod смотреть примеры.

рони 10.05.2021 11:23

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>

Vaska 10.05.2021 16:54

рони,спасибо, за помощь!
В целом скрипт работает, как я хотел.
Но есть проблема в выражении.
Переписанное выражение, для скрипта, не видит название домена, как ошибку, в тексте, например javascript.ru и пропускает его для отправки сообщения. Выражение для PHP видит название домена и вырезает его при записи в базу данных.
Можете пересмотреть выражение и поправить его для скрипта правильно?

рони 10.05.2021 17:05

Цитата:

Сообщение от Vaska
Можете пересмотреть выражение и поправить его?

поправил, если не подошло, ищите в сборниках RegExp и в целом по инету

Vaska 10.05.2021 17:22

рони,
Сейчас работает.
Спасибо, за помощь!

Vaska 10.05.2021 20:35

рони,
Можно ли добавить в ваше регулярное выражение условие: кроме ссылок содержащих доменное имя javascript.ru, или содержащее доменное имя subdomain.javascript.ru?
Я посмотрел в интернете, но такую конструкцию я сам не осилил добавить.

рони 10.05.2021 21:35

запрет ссылок кроме содержащих 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>

Vaska 10.05.2021 21:47

рони,
с тестовым содержимым формы выражение правильно отрабатывает.
Однако, если удалить всё содержимое, оставить только javascript.ru, нажать кнопку "Отправить", далее изменить javascript.ru на sjavascript.ru - тогда разрешает стороннему домену пройти проверку и сообщение отправляется. Это неправильно.

рони 10.05.2021 21:49

Vaska,
запрет ссылок кроме содержащих javascript.ru


Часовой пояс GMT +3, время: 12:55.