2017-01-05 7 views
0

http://jsfiddle.net/f4Zkm/213/Regex Wildcard в угловом

HTML

<div ng-app> 
    <div ng-controller="MyController"> 
     <input type="search" ng-model="search" placeholder="Search..."> 
     <ul> 
      <li ng-repeat="name in names | filter:filterBySearch"> 
       {{ name }} 
      </li> 
     </ul> 
    </div> 
</div> 

app.js

function escapeRegExp(string){ 
    return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); 
} 
function MyController($scope) { 
    $scope.names = [ 
    'Lolita Dipietro', 
    'Annice Guernsey', 
    'Gerri Rall', 
    'Ginette Pinales', 
    'Lon Rondon', 
    'Jennine Marcos', 
    'Roxann Hooser', 
    'Brendon Loth', 
    'Ilda Bogdan', 
    'Jani Fan', 
    'Grace Soller', 
    'Everette Costantino', 
    'Andy Hume', 
    'Omar Davie', 
    'Jerrica Hillery', 
    'Charline Cogar', 
    'Melda Diorio', 
    'Rita Abbott', 
    'Setsuko Minger', 
    'Aretha Paige']; 

    $scope.search = ''; 
    var regex; 
    $scope.$watch('search', function (value) { 
     regex = new RegExp('\\b' + escapeRegExp(value), 'i'); 
    }); 

    $scope.filterBySearch = function(name) { 
     if (!$scope.search) return true; 
     return regex.test(name); 
    }; 
} 

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

Текущий выход: Если входной сигнал di, он показывает все соответствующие соответствия.

Обязательно: То, что я пытаюсь получить, если входной сигнал di */* (любой вход), он должен показывать все совпадения в соответствии с данным вводом.

+1

Просьба представить некоторые пример ввода и ожидаемого результата. Из вашего вопроса неясно, что вы хотите и что не работает. – wdosanjos

+0

@wdosanjos, пожалуйста, проверьте обновленный вопрос [link] (http://stackoverflow.com/questions/41514450/how-to-add-regex-in-angular-filter). –

ответ

1

Есть пара вопросов с вашим подходом. Во-первых, вы избегаете * в вашей рутинной программе, поэтому клиент не может ее использовать.

Во-вторых, вы не привязываете свои линии, поэтому матч может происходить где угодно.

Чтобы исправить, удалите звездочку из функции побега:

function escapeRegExp(string){ 
    return string.replace(/([.+?^=!:${}()|\[\]\/\\])/g, "\\$1"); 
} 

Затем в функции часов заменить * с .* и добавить строки якоря:

$scope.$watch('search', function (value) { 
     var escaped = escapeRegExp(value); 
     var formatted = escaped.replace('*', '.*') 

     if(formatted.indexOf('*') === -1){ 
      formatted = '.*' + formatted + '.*' 
     } 

     regex = new RegExp('^' + formatted + '$', 'im'); 
    }); 

Here is a fiddle

+0

Привет. Большое вам спасибо за ваш вклад. Теперь обычный поиск не работает. (т. е. «Лолита» не ищет матчи. и те же проблемы возникают во втором слове имени. Когда я пытаюсь найти «Dipietro», это не приносит никакого результата. –

+0

Правильно, так как теперь вам требуется подстановочный знак, чтобы соответствовать до или после слова. Не могли бы вы привести несколько примеров того, какие шаблоны вы могли бы ожидать? Я немного смущен о том, как вы хотите, чтобы дикая карта работала – swestner

+0

, пожалуйста, проверьте обновленный вопрос [regEx в угловом фильтре] (http://stackoverflow.com/questions/41514450/how-to-add-regex-in- угловой-фильтр). –