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
Форумы портала PHP.SU :: Версия для печати :: помогите составить регулярку на js с поиском строковых значений
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » помогите составить регулярку на js с поиском строковых значений

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

1. ПТО - 20 Августа, 2015 - 11:51:22 - перейти к сообщению
Я вообще не понимаю регулярные выражения, если можно без них, то оно и к лучшему:

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

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

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

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

Как реализовать это? В плагине datatables.net такое реализовано
Не понял
2. Мелкий - 20 Августа, 2015 - 12:21:33 - перейти к сообщению
Итерируете свой массив. Если по проверяемой строке indexOf вернул -1, то сразу возвращаете false. Если успешно вышли из цикла - возвращаете безусловное true.
3. IllusionMH - 20 Августа, 2015 - 12:27:29 - перейти к сообщению
ПТО, Array.prototype.every + String.prototype.indexOf (как сказали выше)
4. andrewkard - 20 Августа, 2015 - 12:33:03 - перейти к сообщению
...
5. ПТО - 20 Августа, 2015 - 13:08:20 - перейти к сообщению
Мелкий пишет:
Итерируете свой массив. Если по проверяемой строке indexOf вернул -1, то сразу возвращаете false. Если успешно вышли из цикла - возвращаете безусловное true.

итерируйте?
Можно чуть-чуть написать?
6. Мелкий - 20 Августа, 2015 - 13:28:03 - перейти к сообщению
Т.е. пройдите по всем элементам массива любым понравившимся способом.
7. andrewkard - 20 Августа, 2015 - 13:47:40 - перейти к сообщению
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.  
8. IllusionMH - 20 Августа, 2015 - 14:01:47 - перейти к сообщению
andrewkard, а не проще в функцию и при первом ненайденном делать return false, а за циклом уже return true? зачем массивы плодить?
9. andrewkard - 20 Августа, 2015 - 14:53:17 - перейти к сообщению
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.  
10. SAD - 20 Августа, 2015 - 16:45:48 - перейти к сообщению
CODE (javascript):
скопировать код в буфер обмена
  1. new RegExp(arr_data.join('|'), 'g').test(str)
11. IllusionMH - 20 Августа, 2015 - 17:00:34 - перейти к сообщению
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. }
12. SAD - 20 Августа, 2015 - 17:47:51 - перейти к сообщению
ааа, я не читал просто задание Радость
13. SAD - 20 Августа, 2015 - 21:26:02 - перейти к сообщению
Общими усилиями пришли к решению

CODE (javascript):
скопировать код в буфер обмена
  1. str.match(new RegExp('(' + arr_data.join('|') + ')(?!.*\\1)', 'g')).length === arr_data.length
14. IllusionMH - 21 Августа, 2015 - 02:19:56 - перейти к сообщению
SAD, ох ты ж... Превосходно
Пару минут потратил чтобы понять как оно работаете в случае true, и еще 5 тупил почему оно корректно выдает false. Огорчение
Единственный минус этого кода - без нормальной доки сверху с пояснениями понять будет затруднительно многим.
15. armancho7777777 - 21 Августа, 2015 - 23:37:17 - перейти к сообщению
SAD пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. str.match(new RegExp('(' + arr_data.join('|') + ')(?!.*\\1)', 'g')).length === arr_data.length

Красивое решение.
+1

 

Powered by ExBB FM 1.0 RC1