Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение не понимает кириллицу. Как исправить? (https://javascript.ru/forum/misc/85069-regulyarnoe-vyrazhenie-ne-ponimaet-kirillicu-kak-ispravit.html)

javascript_pupil 24.03.2023 12:01

Регулярное выражение не понимает кириллицу. Как исправить?
 
Есть простой скрипт, исправляющий небольшие ошибки за пользователями. Если пользователь поставил после точки строчную букву скрипт делает её заглавной. Работает, но необходимо, чтобы скрипт не делал буквы заглавными после аббревиатур типа и т.д. и т.п. В регулярном выражении на кириллицу скрипт не реагирует, но работает на латинице и не поднимает букву после t.d. Помогите, пожалуйста, исправить. Код следует.

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

<script>
function replaceChars(entry) {

var obj = document.forms[0].elements[entry];
var str = obj.value;

var re = /(?<!t\.d)\. \S/g; // После точки слова начинаются с большой буквы если это не аббревиатуры
while(x = re.exec(str)) str = str.replace(x[0], x[0].toUpperCase());

obj.value = str;
}
</script>

<form>

<p>Text</p>
<textarea id="text" name="text" style="width:80%; height:400px;" required>Слова после точки начинаются с Заглавной буквы, если это не аббревиатуры типа и т.д. и т.п. как вы поняли и t.d. после которых ставить заглавную не надо. этот текст нужно исправить. и поставить заглавные буквы правильно.</textarea>
<p><a href="#" onclick="replaceChars('text'); return false;">Fix!</a></p>

</form>
</body>
</html>

рони 24.03.2023 13:05

javascript_pupil,
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Test</title>
</head>
<body>
    <script>
        function replaceChars(entry) {
            var obj = document.forms[0].elements[entry];
            var str = obj.value;
            var re = /(?<!(т\.д|т\.п|t\.d))\. \S/g; // После точки слова начинаются с большой буквы если это не аббревиатуры
            str = str.replace(re, a => a.toUpperCase())
            obj.value = str;
        }
    </script>
    <form>
        <p>Text</p>
        <textarea id="text" name="text" style="width:80%; height:400px;" required>Слова после точки начинаются с Заглавной буквы, если это не аббревиатуры типа и т.д. и т.п. как вы поняли и t.d. после которых ставить заглавную не надо. этот текст нужно исправить. и поставить заглавные буквы правильно.</textarea>
        <p><a href="#" onclick="replaceChars('text'); return false;">Fix!</a></p>
    </form>
</body>
</html>

рони 24.03.2023 13:07

javascript_pupil,
про run не забывайте

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

javascript_pupil 24.03.2023 18:08

Цитата:

Сообщение от рони
про run не забывайте

Понял. Искал, сделал сначала HTML, потом JS, но оба не сработали. Теперь ясно.

Код работает, спасибо! Два вопроса остались:
1. Можно ли сделать эту конструкцию IE11* совместимой?
2. Почему всё-таки кириллица не работала, когда латиница нормально?

* Как по мне, так IE11 гораздо более быстрый, надежный и удобный, чем многие "современные" браузеры на новых движках. Не зря все монстры типа M$ & CF на него ополчились. Говорят небезопасный, но для администрирования своих собственных сайтов вполне подходит. :)

рони 24.03.2023 18:24

javascript_pupil,
Ретроспективная проверка
Цитата:

Lookbehind не поддерживается в браузерах построенных не на движке V8, таких как Safari и Internet Explorer.

рони 24.03.2023 18:37

Цитата:

Сообщение от javascript_pupil
1. Можно ли сделать эту конструкцию IE11* совместимой?

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <title>Test</title>
</head>
<body>
    <script>
        function replaceChars(entry) {
            var obj = document.forms[0].elements[entry];
            var str = obj.value;
            var re = /(\S+)(\. \S)/g;
            str = str.replace(re, function(a, b, c) {
                if (!/(т\.д|т\.п|t\.d)$/.test(b)) c = c.toUpperCase();
                return b + c
            })
            obj.value = str;
        }
    </script>
    <form>
        <p>Text</p>
        <textarea id="text" name="text" style="width:80%; height:400px;" required>Слова после точки начинаются с Заглавной буквы, если это не аббревиатуры типа и т.д. и т.п. как вы поняли и t.d. после которых ставить заглавную не надо. этот текст нужно исправить. и поставить заглавные буквы правильно.</textarea>
        <p><a href="#" onclick="replaceChars('text'); return false;">Fix!</a></p>
    </form>
</body>
</html>

Цитата:

Сообщение от javascript_pupil
2. Почему всё-таки кириллица не работала, когда латиница нормально?

где код?

рони 24.03.2023 18:39

javascript_pupil,
https://caniuse.com/js-regexp-lookbehind


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