Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » вопросы по javascript

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Обнаружил, что открывающая квадратная скобка [ работает там как граница начала слова в таком формате: «[[Яя]п» (будут найдены все слова, начинающиеся на «Яп/яп»).

потому, что вы вводите js регулярное выражение, а квадратные скобки часть многих регулярок не только в js
лучше формировать регулярки по строке пользователя, используя точку как 1 символ, звездочку как сколько угодно и тд и тп. я уже писал об это выше.
 

Цитата:
Есть ли возможность отключить чувствительность к регистру при поиске?

формировать правильно регулярное выражение.
https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Regular_Expressions

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 03:18 10-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii

Цитата:
формировать правильно регулярное выражение

Имелось в виду — чтобы не было необходимости учитывать ситуацию с регистром. Чтобы это работало как при простом поиске — искались бы слова в любом регистре, и только по необходимости можно было бы включать поиск прописных или строчных, прописывая для этого шаблон?

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 03:51 10-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Имелось в виду  

я отлично понял что имелось в виду, поэтому и дал ссылку, чтобы почитали как работают с регулярками.
 

Код:
var pattern = new RegExp(value, 'i');

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 04:31 10-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Спасибо!

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 04:37 10-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Таки нашлось решение искать в виджете несмотря на наличие ударений в тексте — https://supportcenter.devexpress.com/ticket/details/t435406/dxdatagrid-how-to-perform-accent-insensitive-search
 
Возник вопрос: можно ли совместить подсказанную мне ранее тут функцию для поиска по регулярным выражениям
 

Код:
function gCalculateFilterExpression (value, selectedFilterOperations, target, self) {  
        if (target === "filterRow") {
            return [function(dataItem) {
        var pattern = new RegExp(value, 'i');
        if (dataItem[self.dataField].match(pattern)) {  
                    return true;  
                }  
                else {
                    return false;  
                }  
            }, "=", true];  
        }  
        else {  
            return self.defaultCalculateFilterExpression.apply(self, arguments);  
        }  
    }

 
— с этой функцией, которая пропускает знаки ударений? —
 

Код:
        calculateFilterExpression: function(value, selectedFilterOperation, target){  
            var getter = function(data) {  
              return data['bbb'].normalize('NFD').replace(/[\u0300-\u036f]/g,"");  
            };  
 
            value = value.normalize('NFD').replace(/[\u0300-\u036f]/g,"");  
 
            return [getter, selectedFilterOperation || "contains", value];  
        }

 
Добавлено:
 
А ещё вроде это позволяет искать сквозь теги, если заменить это —
 
[\u0300-\u036f]
 
на это —
 
([\u0300-\u036f]|<[^>]*>)
 
 
 
 
Добавлено:
Так же по букве «ё» хотелось бы настроить, чтобы, к примеру, при поиске слова «берёза», можно было не набирать букву «ё» и находить это слово. Как вписать замену кода буквы ё \u0451 — на е \u0435 ?

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 18:40 10-07-2021 | Исправлено: D1D1D1D, 18:47 10-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
можно ли совместить подсказанную мне ранее тут функцию для поиска по регулярным выражениям

можно. и очевидно как.
 
приводите к "нормальному" виду как и строку поиска, как и содержимое ячейки.
а зачем все по старому.
 
то есть вот тут

Код:
var pattern = new RegExp(нормировка(value), 'i'), cell = нормировка(dataItem[self.dataField]);
        if (cell.match(pattern)) {
...

а уж в функции нормировка() делаете какие вам нужно преобразования.
function нормировка(value) {
   value = ....;
   return value;
}
в частности замена ё на е

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 05:42 11-07-2021 | Исправлено: Mavrikii, 05:43 11-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Всё-таки, затрудняюсь) Сложноватый пока для меня уровень)

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 12:51 11-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Первые две строки кода вроде правильно добавил, а с функцией не складывается —

Код:
function gCalculateFilterExpression (value, selectedFilterOperations, target, self) {  
        if (target === "filterRow") {
            return [function(dataItem) {
        var pattern = new RegExp(normalize(value), 'i'), cell = normalize(dataItem[self.dataField]);
        if (cell.match(pattern)) {
   
                    return true;  
                }  
                else {
                    return false;  
                }  
            }, "=", true];  
        }  
        else {  
            return self.defaultCalculateFilterExpression.apply(self, arguments);  
        }  
    }
 
 
        function normalize(value) {
            var getter = function(data) {  
              return data['bbb'].normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
            };  
 
            value = value.normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
 
            return [getter, selectedFilterOperation || "contains", value];  
        }

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 21:39 11-07-2021 | Исправлено: D1D1D1D, 21:41 11-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
а с функцией не складывается  

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

Код:
function normalize(value) {
              return value.normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
}

 
что то такое

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 22:57 11-07-2021 | Исправлено: Mavrikii, 23:08 11-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Спасибо!
 
Добавлено:
Обнаружилось такое поведение — если разбить строку из базы, прописав тэг <br> —
 
"aaa": "ершистый<br>задорный"
 
то после запуска в браузере тэги удалятся (как это у нас прописано), но при поиске в колонке результаты выводятся, как будто это одна строка. То есть, в окне браузера видно следующее:
 
ершистый
за
дорный
 
И по запросу «тыйза» показывается эта ячейка. Можно ли запретить поиск на новой строке? Пробовал прописывать флаги регулярных выражений рядом с «i», но не сработало.
 
var pattern = new RegExp(normalize(value), 'i')

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 23:33 11-07-2021 | Исправлено: D1D1D1D, 23:46 11-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D
замените сначала <br> обратно на \n, тогда вырезаться не будет.

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 23:49 11-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Большое спасибо! Прописал вот так — \r\n — иначе результаты после поиска не обновлялись.

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 00:11 12-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Прописал вот так — \r\n  

но лучше пробел, чтобы можно было искать два слова вместе.

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 00:20 12-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
После изменения первого кода — на второй — заметил, что перестали реагировать опции из выпадающего списка («Содержит», «Не содержит», «Начинается с», «Заканчивается на» и тд). Не могли бы Вы взглянуть, правильно ли во втором коде всё прописано? —

Код:
function gCalculateFilterExpression (value, selectedFilterOperations, target, self) {  
        if (target === "filterRow") {
            return [function(dataItem) {
        var pattern = new RegExp(value, 'i');
        if (dataItem[self.dataField].match(pattern)) {  
                    return true;  
                }  
                else {
                    return false;  
                }  
            }, "=", true];  
        }  
        else {  
            return self.defaultCalculateFilterExpression.apply(self, arguments);  
        }  
    }
 

Код:
function gCalculateFilterExpression (value, selectedFilterOperations, target, self) {  
        if (target === "filterRow") {
            return [function(dataItem) {
        var pattern = new RegExp(normalize(value), 'i'), cell = normalize(dataItem[self.dataField]);
        if (cell.match(pattern)) {
                    return true;  
                }  
                else {
                    return false;  
                }  
            }, "=", true];  
        }  
        else {  
            return self.defaultCalculateFilterExpression.apply(self, arguments);  
        }  
    }
function normalize(value) {
        value = value.normalize('NFD').replace(/([\u0300-\u036f]|<[^>]*>)/g,"");
        value = value.normalize('NFD').replace(/\u0451/g,"\u0435"); //ё—е
        return value;
}

 
А это был код объединённый с первым:

Код:
        calculateFilterExpression: function(value, selectedFilterOperation, target){  
            var getter = function(data) {  
              return data['bbb'].normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
            };  
 
            value = value.normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
 
            return [getter, selectedFilterOperation || "contains", value];  
        }  


Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 00:35 12-07-2021 | Исправлено: D1D1D1D, 00:39 12-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
заметил, что перестали реагировать опции из выпадающего списка («Содержит», «Не содержит», «Начинается с», «Заканчивается на» и тд)

ессно перестанет, так как умеет только регулярку.
поэтому даже в оригинальном примере прописано

Цитата:
 filterOperations: ['contains','='],  
    selectedFilterOperation: 'contains',  

 

Цитата:
if (target === "filterRow") {

добавить условие на использование регулярки. смотреть значение selectedFilterOperations
чтобы когда не нужна была регулярка срабатывало встроенное return self.defaultCalculateFilterExpression.apply(self, arguments);  
там, правда, дополнительный элемент self может проблемы создать, но это уже проверять и смотреть нужно.

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 00:38 12-07-2021 | Исправлено: Mavrikii, 00:41 12-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Вроде как код с регулярками с теми опциями нормально работал, а перестали они работать после объединения кода с регулярками — с кодом, удаляющим ударения и теги. Может, надо какие-то нюансы отсюда перенести в дополненный код с регулярками? —
 

Код:
        calculateFilterExpression: function(value, selectedFilterOperation, target){  
            var getter = function(data) {  
              return data['bbb'].normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
            };  
 
            value = value.normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g,"");  
 
            return [getter, selectedFilterOperation || "contains", value];  
        }  

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 00:44 12-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
Вроде как код с регулярками с теми опциями нормально работал

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

Код:
function gCalculateFilterExpression(value, selectedFilterOperations, target, self)
{
    var getter = function(data)
    {
        return data.normalize('NFD').replace(/([\u0300-\u036f]|\u007C\u007C|<[^>]*>)/g, "").replace(/\u0451/g,"\u0435");
    };
    
    if (target === "filterRow" && selectedFilterOperations == 'contains')
    {
        return [function(dataItem)
        {
            var pattern = new RegExp(getter(value), 'i'),
                cell = getter(dataItem[self.dataField]);
            if (cell.match(pattern))
            {
                return true;
            }
            else
            {
                return false;
            }
        }, "=", true];
    }
    else
    {
        return [function(dataItem) { return getter(dataItem[self.dataField]); }, selectedFilterOperation || 'contains', value];
    }
}

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

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 01:11 12-07-2021 | Исправлено: Mavrikii, 02:03 12-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Не срабатывает, к сожалению. Впрочем, эти опции не принципиальны — просто интересно, почему по отдельности оба кода нормально с опциями работают, а после их объединения сбои идут.
 
Добавлено:
А поможет, если их не объединять в отдельной функции, а прописывать в основном коде, в columns: [] — как это изначально было?

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 02:13 12-07-2021 | Исправлено: D1D1D1D, 02:14 12-07-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
D1D1D1D

Цитата:
просто интересно, почему по отдельности оба кода нормально с опциями работают

не может первый код нормально работать, вам только кажется.
 
ps: тут опечатка
return [function(dataItem) { return getter(dataItem[self.dataField]); }, selectedFilterOperation || 'contains', value];
должно быть  
selectedFilterOperations, скопировал просто
 
и эта регулярка прописана только для одного условия - содержит.
остальное будет работать не используя ее. то есть если будет регулярное выражение и опция отличная от "содержит", то будет искать строку, а не регулярку. и тд и тп.

Всего записей: 15687 | Зарегистр. 20-09-2014 | Отправлено: 02:30 12-07-2021 | Исправлено: Mavrikii, 02:40 12-07-2021
D1D1D1D

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
не может первый код нормально работать

Прошу взглянуть — https://disk.yandex.ru/d/3oIhj2wvT100IA
К примеру, вот тут в первой колонке настроена работа Regex, а во второй колонке задействовано удаление тегов, акцентов — но без регулярок. Соответственно, в первой колонке можно искать «аб.зинка» — и выбрать, к примеру, опцию «Равно». И так же во второй колонке— вписать любое слово в опцию «Равно» — и оно будет найдено. Вроде как под «Содержит» это не подпадает, потому что там же теги присутствуют?
 

Цитата:
ps: тут опечатка

Посмотрю, спасибо
 
Добавлено:
Mavrikii
Вроде то же самое — врозь работают, а вместе нет. Может, надо именно в columns:[] их прописать — несмотря, что их надо будет дублировать для каждой колонки?

Всего записей: 1470 | Зарегистр. 05-04-2010 | Отправлено: 02:53 12-07-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

Компьютерный форум Ru.Board » Интернет » Web-программирование » вопросы по javascript


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru