Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Скрипт для автоцензуры текстовых полей (https://javascript.ru/forum/dom-window/29980-skript-dlya-avtocenzury-tekstovykh-polejj.html)

Demath 19.07.2012 20:10

Скрипт для автоцензуры текстовых полей
 
Помогите доделать скрипт для автоцензуры заголовков тем (или любого другого текстового поля).
Устал от бредовых заголовков на своём форуме.
Нужно, чтобы, как только пользователь наберёт стоп-слово, скрипт его тут же удалял и выводил модальное окно с объяснением, почему это не есть гут, что, в принципе, получилось сделать.
Застрял на:
- запрете слов, в которых смешаны кириллические и латинские буквы, и смеси слов с цифрами?
- замене первой буквы на заглавную? (без text-transform из CSS, скриптово)
- удалении точки, если она является самым последним символом в строке?

<!DOCTYPE html>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">

<script type=text/javascript>
stopWords=['помогите','помагите','памогите','памагите','срочно','горю',
           'пожалуйста','пожалуста','пжл','пож.','плиз','хелп','надо',
           'нужно','нужна','необходим','нуждаюсь','прошу','помощи',
		   'нужна ваша помощь','хочу','хотелось бы','как бы','как-бы',
		   'какбы','завтра','умоляю','подскажите','нужен совет','!',
		   'ребята','люди','уважаемые','окажите помощь','здравствуйте',
		   'здраствуйте','спасибо','спс','благодар','болею','болел',
		   'больниц','беремена','попросил','такой','такая','такое',
		   'такие','help','plz','pls','please','pleas','plez','sos']

function test(obj)
{   obj=document.getElementById("abcd");
    currentText=obj.value;
    for(var i=0; i<stopWords.length; i++)
        {re=new RegExp(stopWords[i],"gi");
         if(re.test(currentText))
            {temp="";
             for(var j=0; j<stopWords[i].length; j++){temp+=""}
             currentText=currentText.replace(re,temp);
             obj.value=currentText;
             alert('Уважаемый пользователь!\n\nСогласно Правилам форума, '+
                   'в Названии сообщения не\nдопустимы слова и выражения, '+
                   'не отражающие его суть:\n\nПомогите, Срочно, '+
                   'Пожалуйста, Плиз, Хелп, Help, SOS\nи т.д. и т.п.'+
                   '\n\nАдминистрация настоятельно рекомендует Вам впредь '+
                   'не\nнарушать Правила форума, в противном случае на Вас '+
                   'будут\nналожены санкции, вплоть до вечного бана.');
           }
        }
}
</script>
  
<body>
<p>Введите любое из слов:<br />
<b>помогите, срочно, горю, пожалуйста, плиз, хелп, help, sos</b></p>
<input style="width: 400px;" placeholder="Здесь" id="abcd" onkeyup="test(this)" onchange="test(this)">
</body>
</html>

Deff 19.07.2012 22:11

<script type=text/javascript>
stopWords=['помогите','помагите','памогите','памагите','срочно','горю',
           'пожалуйста','пожалуста','пжл','пож.','плиз','хелп','надо',
           'нужно','нужна','необходим','нуждаюсь','прошу','помощи',
		   'нужна ваша помощь','хочу','хотелось бы','как бы','как-бы',
		   'какбы','завтра','умоляю','подскажите','нужен совет','!',
		   'ребята','люди','уважаемые','окажите помощь','здравствуйте',
		   'здраствуйте','спасибо','спс','благодар','болею','болел',
		   'больниц','беремена','попросил','такой','такая','такое',
		   'такие','help','plz','pls','please','pleas','plez','sos']

function test2(a,b) {var FlagStop=false;
      if(a.indexOf(b)!=-1) {FlagStop=true;
      a=a.replace(b,'...');
      a=test2(a,b);alert(a)
      }
 return a;
}

function test(obj)
{   obj=document.getElementById("abcd");
    currentText=obj.value;

    for(var i=0; i<stopWords.length; i++){
        currentText=test2(currentText,stopWords[i])
    }
	  if(currentText!=obj.value){
             alert('Уважаемый пользователь!\n\nСогласно Правилам форума, '+
                   'в Названии сообщения не\nдопустимы слова и выражения, '+
                   'не отражающие его суть:\n\nПомогите, Срочно, '+
                   'Пожалуйста, Плиз, Хелп, Help, SOS\nи т.д. и т.п.'+
                   '\n\nАдминистрация настоятельно рекомендует Вам впредь '+
                   'не\nнарушать Правила форума, в противном случае на Вас '+
                   'будут\nналожены санкции, вплоть до вечного бана.');
           }

}
</script>

Demath 19.07.2012 23:10

Deff, простите, не работает.

Demath 19.07.2012 23:29

Deff, а что Вы добавили? В смысле, что должно происходить?
Я ввожу стоп-слово, но ничего не происходит(

Извините, за идиотский вопрос.

Deff 19.07.2012 23:54

<!DOCTYPE html>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">

<script type=text/javascript>
stopWords=['помогите','помагите','памогите','памагите','срочно','горю',
           'пожалуйста','пожалуста','пжл','пож.','плиз','хелп','надо',
           'нужно','нужна','необходим','нуждаюсь','прошу','помощи',
		   'нужна ваша помощь','хочу','хотелось бы','как бы','как-бы',
		   'какбы','завтра','умоляю','подскажите','нужен совет','!',
		   'ребята','люди','уважаемые','окажите помощь','здравствуйте',
		   'здраствуйте','спасибо','спс','благодар','болею','болел',
		   'больниц','беремена','попросил','такой','такая','такое',
		   'такие','help','plz','pls','please','pleas','plez','sos']

function test2(a,b) {var FlagStop=false;
      if(a.indexOf(b)!=-1) {FlagStop=true;
      a=a.replace(b,'...');
      a=test2(a,b);//alert(a)
      }
 return a;
}

function test(obj)
{   obj=document.getElementById("abcd");
    var a=obj.value;
    obj.value=(a.substr(0,1).toUpperCase(0)+a.substr(1))
    currentText=obj.value;

    for(var i=0; i<stopWords.length; i++){
        currentText=test2(currentText,stopWords[i])
    }        alert('Выходной текст с правками: \n'+currentText)
	  if(currentText!=obj.value){
             alert('Уважаемый пользователь!\n\nСогласно Правилам форума, '+
                   'в Названии сообщения не\nдопустимы слова и выражения, '+
                   'не отражающие его суть:\n\nПомогите, Срочно, '+
                   'Пожалуйста, Плиз, Хелп, Help, SOS\nи т.д. и т.п.'+
                   '\n\nАдминистрация настоятельно рекомендует Вам впредь '+
                   'не\nнарушать Правила форума, в противном случае на Вас '+
                   'будут\nналожены санкции, вплоть до вечного бана.');
           }

}
</script>
  
<body>
<p>Введите любое из слов:<br />
<b>помогите, срочно, горю, пожалуйста, плиз, хелп, help, sos</b></p>
<textarea style="width: 400px; height: 100px" id="abcd" onkeyup="test(this)" onchange="test(this)"></textarea>
</body>
</html>

Demath 20.07.2012 00:36

Deff,

Не совсем понимаю, что должна делать эта функция?

function test2(a,b) {var FlagStop=false;
      if(a.indexOf(b)!=-1) {FlagStop=true;
      a=a.replace(b,'...');
      a=test2(a);//alert(a)
      }
 return a;
}

Deff 20.07.2012 00:40

Demath,
a - это входной текст - b - проверяемое слово
Если оно есть - входной текст трансформируется - вместо запретного слова ставицо троеточие и идет повторная проверка на это же слово - если этого слова более нет - в исходный текст возвращается преобразованный текст с удалением(или без, если слово не найдено)
Попробуйте ввести несколько одинаковых недопустимых слов в тексте - должно удалить все (вбейте связный текст

Ксать поправил - в рекурсивном Вызове забыл второй аргумент b (* a=test2(a,b);//alert(a)

Ксать я бы проверял по вводу символов с клавиатуры и при отправке по нажатию кнопки - а после проверки - если все удачно - субмитил, если нет = то только извещение, (* можно заодно и трансформировать текст в textarea вместе с Выводом уведомления - АLERT - автоматом вызывает onchange= и идет повторное уведомление

Demath 20.07.2012 00:57

Deff, спасибо, понял.

Мой вариант в моём первом посте неверен?
Просто хочу осознать свои ошибки.

Как заменить самую первую букву в <input type=text> на заглавную сразу после ввода пользователем?

Нашёл на этом сайте готовую функцию http://learn.javascript.ru/string#смена-регистра, но не догоняю, как её использовать((

Deff 20.07.2012 01:03

Demath,
Да не смотрел тщательно, но в нём однозначно будут сложности про Ваши хитрые Слова и на повтор того же слова при вводе копированием - не будет проверки

Demath 20.07.2012 01:11

Цитата:

Сообщение от Deff
но в нём однозначно будут сложности про Ваши хитрые Слова и на повтор того же слова при вводе копированием - не будет проверки

Проверил - скрипт работает при копипасте.

Или я Вас не так понял?

Deff 20.07.2012 01:14

Цитата:

Сообщение от Demath
ак заменить самую первую букву в <input type=text> на заглавную сразу после ввода пользователем?

Demath,
Гы поправил - зато нашел крупный недочет в своей методе (нет замены при заглавно-незаглавных буквах в запрещенных

Demath 20.07.2012 01:38

Цитата:

Сообщение от Deff (Сообщение 190121)
При копипасте вставьте два идентичных слова запрещенных - они не будут преобразованы - только первое

Вставил два подряд идентичных стоп-слова: помогите, помогите. Также вставлял и без запятых, и слитно.
Все преобразовывается (удаляется).

Deff 20.07.2012 11:28

Demath,
Выложите примеры тестовых слов со спецсимволами

Demath 24.07.2012 12:43

Я имел ввиду, чтобы нельзя было чередовать русские и латинские буквы (и с цифрами смеси), например, смесь

"пoмoгитe" (латинские выделены жирным)

Можно ли задать условие, чтобы сразу после русской буквы нельзя было ввести ничего, кроме тоже русской буквы, пробела и знака препинания?

Deff 24.07.2012 12:54

Demath,
Работа - не благодарная - обычно регеспы цензуры - задаются в Админке,
Извернуться с использованием - можно - как угодно, К примеру обрамить букву в тег черного цвета
Обычно цензура лишь уведомляет неопытного пользователя, а не спецом задавшегося целью обойти её, против лома есть только модерирование и бан

Demath 24.07.2012 16:10

Цитата:

Сообщение от Deff
Работа - не благодарная - обычно регеспы цензуры - задаются в Админке,
Извернуться с использованием - можно - как угодно, К примеру обрамить букву в тег черного цвета

Спасибо за наводку.

Цитата:

Сообщение от Deff
Обычно цензура лишь уведомляет неопытного пользователя, а не спецом задавшегося целью обойти её, против лома есть только модерирование и бан

Понятно, что этот скрипт не панацея, но, я думаю, что он поможет уменьшить количество некорректных заголовков процентов на 80.

Demath 26.07.2012 10:47

Цитата:

Сообщение от Demath
- удалении точки, если она является самым последним символом в строке?

С этим разобрался, вроде бы (?)

<!DOCTYPE html>
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=utf-8">
<script type="text/javascript">
function deleteEndPoint(obj)
{   obj=document.getElementById('abcd');
     var str=obj.value;
     if(str.slice(-1)=='.') {obj.value=str.slice(0, -1);
          alert('Уважаемый пользователь!\n\nТочка в конце заголовка не ставится.')
         }
}
</script>
</head>
<body>
<input style="width: 400px;" id="abcd" onblur="deleteEndPoint(this)">
</body>
</html>

_________________________________________

Как получить следующий символ сразу после заданного?

Нужно, чтобы сразу после русской буквы нельзя было ввести ничего, кроме тоже русской буквы или пробела, или знака препинания.

devote 26.07.2012 11:50

Цитата:

Сообщение от Demath
Нужно, чтобы сразу после русской буквы нельзя было ввести ничего, кроме тоже русской буквы или пробела, или знака препинания.

<input id="inp" type="text" value="Test   text   now прИвет мир" style="width: 100%;" />
<script>
    document.getElementById('inp').onkeypress = function( e ) {
        e = e || window.event;
        var self = e.target || e.srcElement,
            caretPos = 0;

        if ( e.which == null ) {
            e.which = e.charCode != null ? e.charCode : e.keyCode;
        }

        if ( e.which == 32 || e.which == 9 || e.which == 8 || e.which == 0 &&
                /[\x21\x22\x23\x24\x25\x26\x27\x28\x2E]/.test( String.fromCharCode( e.keyCode ) ) ) {
            return;
        }

        if ( document.selection ) {
            self.focus();
            var sel = document.selection.createRange();
            sel.moveStart( 'character', -self.value.length );
            caretPos = sel.text.length;
        } else if ( self.selectionStart || self.selectionStart == '0' ) {
            caretPos = self.selectionStart;
        }

        var wordStart = self.value.lastIndexOf( " ", caretPos - 1 ) + 1,
            wordEnd = self.value.indexOf( " ", caretPos );

        wordEnd = ( wordEnd == -1 ? self.value.length : wordEnd ) - wordStart;

        // это наше слово над которым находится курсор
        var word = self.value.substr( wordStart, wordEnd ).replace( /^\s+|\s+$/g, '');

        var isLatin = !/[а-яё]/i.test( String.fromCharCode( e.keyCode ) );
        var isSymbol = !isLatin || /[a-zA-Z]/.test( String.fromCharCode( e.keyCode ) );

        return !word || !isSymbol || ( /[а-яё]+/i.test( word ) ? !isLatin : isLatin );
    }
</script>

Demath 26.07.2012 12:01

devote, спасибо!

devote 26.07.2012 12:02

исправил ошибки

Demath 26.07.2012 12:14

devote, ещё раз спасибо!

Подскажите, как ещё запретить цифры, *, _ , ~ и т.п.?

devote 26.07.2012 12:19

Цитата:

Сообщение от Demath
Подскажите, как ещё запретить цифры, *, _ , ~ и т.п.?

// .....
        var notAllow = /[\d\*_~]/.test( String.fromCharCode( e.keyCode ) );

        return notAllow ? false : !word || !isSymbol || ( /[а-яё]+/i.test( word ) ? !isLatin : isLatin );


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