Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: помогите составить регулярку на js с поиском строковых значений

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
ПТО
Отправлено: 20 Августа, 2015 - 11:51:22
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




Я вообще не понимаю регулярные выражения, если можно без них, то оно и к лучшему:

Задача такая, сам решить не пробовал:

Есть строка, например "Выпить чаю и съесть несколько вкусных круассанов"

есть массив из отдельных слов или их частей ['скольк', 'руасс', 'есть'].

Надо вернуть true, если каждое из слов есть в искомой строке, причем, как видите, части слов тоже. Порядок слов в массиве роли не играет. В каждом элементе массива только по одному слову, пробелов там нет.
В нашем случае вернет true.

Как реализовать это? В плагине datatables.net такое реализовано
Не понял
 
 Top
Мелкий Супермодератор
Отправлено: 20 Августа, 2015 - 12:21:33
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Итерируете свой массив. Если по проверяемой строке indexOf вернул -1, то сразу возвращаете false. Если успешно вышли из цикла - возвращаете безусловное true.


-----
PostgreSQL DBA
 
 Top
IllusionMH
Отправлено: 20 Августа, 2015 - 12:27:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




ПТО, Array.prototype.every + String.prototype.indexOf (как сказали выше)
 
 Top
andrewkard
Отправлено: 20 Августа, 2015 - 12:33:03
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




...

(Отредактировано автором: 20 Августа, 2015 - 12:33:35)

 
 Top
ПТО
Отправлено: 20 Августа, 2015 - 13:08:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 395
Дата рег-ции: Янв. 2012  


Помог: 3 раз(а)




Мелкий пишет:
Итерируете свой массив. Если по проверяемой строке indexOf вернул -1, то сразу возвращаете false. Если успешно вышли из цикла - возвращаете безусловное true.

итерируйте?
Можно чуть-чуть написать?
 
 Top
Мелкий Супермодератор
Отправлено: 20 Августа, 2015 - 13:28:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Т.е. пройдите по всем элементам массива любым понравившимся способом.


-----
PostgreSQL DBA
 
 Top
andrewkard
Отправлено: 20 Августа, 2015 - 13:47:40
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. <script>
  3. var str = "Выпить чаю и съесть несколько вкусных круассанов";
  4. var arr_data = ['скольк', 'руасс', 'есть', '123'];
  5. var arr_check = [];
  6. for (var i=0;i<arr_data.length;i++){
  7.     if (str.indexOf(arr_data[i]) != -1){
  8.         arr_check.push(arr_data[i]);
  9.     }
  10. }
  11. if (arr_data.length == arr_check.length ){
  12.     alert('true');
  13. } else {
  14.     alert('false');
  15. }
  16. </script>
  17.  
 
 Top
IllusionMH
Отправлено: 20 Августа, 2015 - 14:01:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




andrewkard, а не проще в функцию и при первом ненайденном делать return false, а за циклом уже return true? зачем массивы плодить?
 
 Top
andrewkard
Отправлено: 20 Августа, 2015 - 14:53:17
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




IllusionMH
Да, что то подобное думалось, но до этого не дошел:
IllusionMH пишет:
при первом не найденном делать return false

Спасибо.
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. <script>
  3.     var str = "Выпить чаю и съесть несколько вкусных круассанов";
  4.     var arr_data = ['скольк', 'руасс', 'есть'];
  5.  
  6.     function checkAllInStr(s,a){
  7.         for (var i=0;i<a.length;i++){
  8.             if (s.indexOf(a[i]) == -1){
  9.                 return false;
  10.             }
  11.         }
  12.         return true;
  13.     }
  14.  
  15.     alert (checkAllInStr(str,arr_data));
  16. </script>
  17.  

(Отредактировано автором: 20 Августа, 2015 - 14:54:38)

 
 Top
SAD
Отправлено: 20 Августа, 2015 - 16:45:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




CODE (javascript):
скопировать код в буфер обмена
  1. new RegExp(arr_data.join('|'), 'g').test(str)

(Отредактировано автором: 20 Августа, 2015 - 16:48:08)

 
 Top
IllusionMH
Отправлено: 20 Августа, 2015 - 17:00:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




SAD, проверит только входит ли какая-нить из строк, но не обязательно все.

мой вариант (IE9+)
CODE (javascript):
скопировать код в буфер обмена
  1. function test(str, arr_data) {
  2.     return arr_data.every(function (part) {
  3.         return str.indexOf(part) !== -1;
  4.     });
  5. }

(Отредактировано автором: 20 Августа, 2015 - 17:06:01)

 
 Top
SAD
Отправлено: 20 Августа, 2015 - 17:47:51
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




ааа, я не читал просто задание Радость
 
 Top
SAD
Отправлено: 20 Августа, 2015 - 21:26:02
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




Общими усилиями пришли к решению

CODE (javascript):
скопировать код в буфер обмена
  1. str.match(new RegExp('(' + arr_data.join('|') + ')(?!.*\\1)', 'g')).length === arr_data.length
 
 Top
IllusionMH
Отправлено: 21 Августа, 2015 - 02:19:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




SAD, ох ты ж... Превосходно
Пару минут потратил чтобы понять как оно работаете в случае true, и еще 5 тупил почему оно корректно выдает false. Огорчение
Единственный минус этого кода - без нормальной доки сверху с пояснениями понять будет затруднительно многим.

(Отредактировано автором: 21 Августа, 2015 - 02:21:38)

 
 Top
armancho7777777 Супермодератор
Отправлено: 21 Августа, 2015 - 23:37:17
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




SAD пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. str.match(new RegExp('(' + arr_data.join('|') + ')(?!.*\\1)', 'g')).length === arr_data.length

Красивое решение.
+1
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB