正则表达式和 angular 来格式化匹配查询的单词
regex and angular to format words which match the query
我已将输入文本值存储到 ID name=search-query 的变量中。然后我搜索 JSON 数据以找到任何匹配的结果,然后将结果输出到屏幕上。有什么方法可以将与搜索匹配的单词加粗-query.val?我试过使用 ng-bind-html 但它没有输出结果。
<body ng-app="products" ng-controller="ctrl">
<input type="text" id="search-query" name="query" placeholder="Enter product name"></input>
<tbody>
<tr ng-repeat="result in searchResult|orderBy:order:reverse" >
<td >
<a ng-href="{{result.link}}" target="_blank">
//used ng-bind-html or ng-bind, but does not works
<span ng-bind-html="result.name" target="_blank"></span>
</a>
</td>
<td ng-bind="result.type"></td>
</tr>
</tbody>
var app2 = angular.module('products', []);
app2.controller('ctrl', function($scope) {
$scope.searchResult = [];
$scope.submit = function(){
var search = $("#search-query").val();
$.each(json.products, function(i, v) {
var regex = new RegExp(search, "i");
if (v.name.search(regex) != -1) {
// For the following line, is there a way which I can bold the word which match the search-query.val?
var name = v.name.replace(search, "<b>search</b>"); // doesn't work
$scope.searchResult.push({ name:name, type: v.type, link: v.url });
return;
}
});
}
一种方法是将过滤器与 ng-bind-html 结合使用。我的 plnkr example is copied directly from the angular bootstrap typeahead 指令代码中的过滤器,所以我不认为这是我的功劳:)
但另一部分是使用 ng-model 作为搜索词,而不是使用 jquery 来查找它。
希望这有帮助。
标记:
<input type="text" ng-model="search.name">
<ul>
<li ng-repeat="item in items | filter: search.name">
<span ng-bind-html="item | highlight:search.name"></span>
</li>
</ul>
JavaScript:
var app = angular.module('plunker', ['ngSanitize']);
app.controller('MainCtrl', function($scope) {
$scope.search = {
name: ''
};
$scope.items = ['Jane','John','Sam','Jennifer','Martha'];
});
app.filter('highlight', function($sce, $injector, $log) {
var isSanitizePresent;
isSanitizePresent = $injector.has('$sanitize');
function escapeRegexp(queryToEscape) {
// Regex: capture the whole query string and replace it with the string that will be used to match
// the results, for example if the capture is "a" the result will be \a
return queryToEscape.replace(/([.?*+^$[\]\(){}|-])/g, '\');
}
function containsHtml(matchItem) {
return /<.*>/g.test(matchItem);
}
return function(matchItem, query) {
if (!isSanitizePresent && containsHtml(matchItem)) {
$log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger
}
matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem; // Replaces the capture string with a the same string inside of a "strong" tag
if (!isSanitizePresent) {
matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive
}
return matchItem;
};
});
我已将输入文本值存储到 ID name=search-query 的变量中。然后我搜索 JSON 数据以找到任何匹配的结果,然后将结果输出到屏幕上。有什么方法可以将与搜索匹配的单词加粗-query.val?我试过使用 ng-bind-html 但它没有输出结果。
<body ng-app="products" ng-controller="ctrl">
<input type="text" id="search-query" name="query" placeholder="Enter product name"></input>
<tbody>
<tr ng-repeat="result in searchResult|orderBy:order:reverse" >
<td >
<a ng-href="{{result.link}}" target="_blank">
//used ng-bind-html or ng-bind, but does not works
<span ng-bind-html="result.name" target="_blank"></span>
</a>
</td>
<td ng-bind="result.type"></td>
</tr>
</tbody>
var app2 = angular.module('products', []);
app2.controller('ctrl', function($scope) {
$scope.searchResult = [];
$scope.submit = function(){
var search = $("#search-query").val();
$.each(json.products, function(i, v) {
var regex = new RegExp(search, "i");
if (v.name.search(regex) != -1) {
// For the following line, is there a way which I can bold the word which match the search-query.val?
var name = v.name.replace(search, "<b>search</b>"); // doesn't work
$scope.searchResult.push({ name:name, type: v.type, link: v.url });
return;
}
});
}
一种方法是将过滤器与 ng-bind-html 结合使用。我的 plnkr example is copied directly from the angular bootstrap typeahead 指令代码中的过滤器,所以我不认为这是我的功劳:) 但另一部分是使用 ng-model 作为搜索词,而不是使用 jquery 来查找它。 希望这有帮助。
标记:
<input type="text" ng-model="search.name">
<ul>
<li ng-repeat="item in items | filter: search.name">
<span ng-bind-html="item | highlight:search.name"></span>
</li>
</ul>
JavaScript:
var app = angular.module('plunker', ['ngSanitize']);
app.controller('MainCtrl', function($scope) {
$scope.search = {
name: ''
};
$scope.items = ['Jane','John','Sam','Jennifer','Martha'];
});
app.filter('highlight', function($sce, $injector, $log) {
var isSanitizePresent;
isSanitizePresent = $injector.has('$sanitize');
function escapeRegexp(queryToEscape) {
// Regex: capture the whole query string and replace it with the string that will be used to match
// the results, for example if the capture is "a" the result will be \a
return queryToEscape.replace(/([.?*+^$[\]\(){}|-])/g, '\');
}
function containsHtml(matchItem) {
return /<.*>/g.test(matchItem);
}
return function(matchItem, query) {
if (!isSanitizePresent && containsHtml(matchItem)) {
$log.warn('Unsafe use of typeahead please use ngSanitize'); // Warn the user about the danger
}
matchItem = query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem; // Replaces the capture string with a the same string inside of a "strong" tag
if (!isSanitizePresent) {
matchItem = $sce.trustAsHtml(matchItem); // If $sanitize is not present we pack the string in a $sce object for the ng-bind-html directive
}
return matchItem;
};
});