Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Регулярные выражения в javascript-е - русские буквы (https://javascript.ru/forum/events/45123-regulyarnye-vyrazheniya-v-javascript-e-russkie-bukvy.html)

cajka 15.02.2014 18:56

Регулярные выражения в javascript-е - русские буквы
 
Помогите с регулярными выражениям в javascript-e. Нужно проверить поле формы на ввод русских букв, разрешаются только русские буквы.

Регулярное виражные такое:

var per_name =/^[А-Я]$/i;
if(!per_name.test(name)){
var text = "Разрешены только русские буквы";
}

Но оно не работает. Даже когда вводишь русские буквы, условие срабатывает.

Как правильно писать нужно?

danik.js 15.02.2014 19:16

<form onsubmit="alert('все ок'); return false">
<input type="text" pattern="[а-яА-ЯёЁ]+" required title="Можно использовать только кириллицу" />
<button type="submit">Отправить</button>

cajka 16.02.2014 09:45

Спасибо.

danik.js 16.02.2014 11:01

Должен отметить что HTML5 валидация не работает в старых браузерах. Кроме-того, не всем нравится реализация в браузерах.
Тем не менее, атрибут pattern и required можно всегда использовать, в добавок, если реализация браузера устраивает, подключить polyfill для старых браузеров. Если не устраивает - все равно можно опираться на эти атрибуты. Кстати такой полифил как WebShims позволяет заменить UI на новых браузерах.

Цитата:

Сообщение от cajka
Но оно не работает

У тебя лишнее отрицание. У тя регулярка ищет невалидные символы. Соответственно, если нашла (то есть if (re.test()) ), то алерт. А у тебя наоборот.
<form onsubmit="return false">
<input id="input" value="ффффваыа" />
<button type="submit">Отправить</button>
<script>
(function(){
var input = document.getElementById('input');
input.onchange = function() {
var name = this.value;

var per_name =/^[А-Я]$/i;
if(!per_name.test(name)){
var text = "Разрешены только русские буквы";
}


alert(text || 'Все ок');

};

})();
</script>
</form>

рони 16.02.2014 12:03

:write: вариант ...
<!DOCTYPE HTML>
<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<form onsubmit="return false">
<input id="input" value="ффффваыа" />
<button type="submit">Отправить</button>
<script>
(function(){
var input = document.getElementById('input');
input['oninput' in input ? 'oninput' : 'onpropertychange'] = function() {
var name = this.value;
var per_name =/[^А-ЯЁ]/i;
if(per_name.test(name)){
var text = "Разрешены только русские буквы";
}
text && alert( text);
};
})();
</script>
</form>
</body>
</html>

danik.js 16.02.2014 13:26

Мой вариант, как я и предлагал, в декларативном стиле с fallback'ом на нативную валидацию, скрипт обходит все инпуты:

<!DOCTYPE html>
<meta charset="utf-8" />
<form onsubmit="return false">
    <input id="input" value="ффффваыа" pattern="[а-яА-ЯёЁ]+" required="" title="Разрешены только русские буквы" />
    <button type="submit">Отправить</button>
    <script>
    (function(){
        var inputs = document.getElementsByTagName('input');
        for (var i = 0, input; input = inputs[i]; i++) {
            if (input.type == 'text') {
                input.oninput = oninput;
                // input['oninput' in input ? 'oninput' : 'onpropertychange'] = oninput; // for IE8
            }
        }
        function oninput() {
            var valid = true;
            if ('required' in this.attributes) {
                valid = valid && this.value != '';
            }
            if ('pattern' in this.attributes) {
                var pattern = new RegExp('^' + this.getAttribute('pattern') + '$', 'gi');
                valid = valid && pattern.test(this.value);
            }
            if (!valid) {
                alert(this.title);
            }
        }
    })();
    </script>
</form>

kostyanet 16.02.2014 23:05

Цитата:

Сообщение от cajka
var text = "Разрешены только русские буквы";

var text - 3 русские буквы.

kostyanet 16.02.2014 23:10

Из континуума выпадает только ё, остальное с перерывом на казахские "буквы" идет сплошняком. Вариант предыдущего читателя рони в точности.

И вообще, зачем проверять - по кейпапам берите коды и в кириллицу по кодировке. И все. Кто не переключился - сам виноват.

danik.js 17.02.2014 05:57

Цитата:

Сообщение от kostyanet
var text - 3 русские буквы.

Ну мог бы и уточнить, что правильно будет "кириллица", а не "русские буквы".

kostyanet 17.02.2014 12:05

Так кириллицы натырена с нескольких алфавитов, в том числе и латинского. Так что есть там русские буквы в слове hello word


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