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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 120 121 122 123 124 125

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

Mavrikii

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Всего записей: 1506 | Зарегистр. 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 ?

Всего записей: 1506 | Зарегистр. 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;
}
в частности замена ё на е

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

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

Всего записей: 1506 | Зарегистр. 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];  
        }

Всего записей: 1506 | Зарегистр. 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,"");  
}

 
что то такое

Всего записей: 16417 | Зарегистр. 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')

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

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

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

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

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

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

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

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

Всего записей: 16417 | Зарегистр. 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];  
        }  


Всего записей: 1506 | Зарегистр. 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 может проблемы создать, но это уже проверять и смотреть нужно.

Всего записей: 16417 | Зарегистр. 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];  
        }  

Всего записей: 1506 | Зарегистр. 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];
    }
}

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

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

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

Всего записей: 1506 | Зарегистр. 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, скопировал просто
 
и эта регулярка прописана только для одного условия - содержит.
остальное будет работать не используя ее. то есть если будет регулярное выражение и опция отличная от "содержит", то будет искать строку, а не регулярку. и тд и тп.

Всего записей: 16417 | Зарегистр. 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:[] их прописать — несмотря, что их надо будет дублировать для каждой колонки?

Всего записей: 1506 | Зарегистр. 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 120 121 122 123 124 125

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


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

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

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru