javascript - 如何获取 'Highlight Keyword' 管道来显示不区分大小写的匹配项?

标签 javascript regex angular

我有一个搜索输入,它将突出显示匹配关键字的所有实例。它工作正常,唯一的问题是当我需要不区分大小写时它区分大小写。

这是一个stackblitz一个工作示例

管道:

@Pipe({
  name: 'highlight'
})
export class HighlightSearch implements PipeTransform {
  constructor(private sanitizer: DomSanitizer) { }

  transform(value: any, args: string): any {
    if (!args) {
      return value;
    }
    const specials = [
      // order matters for these
      "-"
      , "["
      , "]"
      // order doesn't matter for any of these
      , "/"
      , "{"
      , "}"
      , "("
      , ")"
      , "*"
      , "+"
      , "?"
      , "."
      , "\\"
      , "^"
      , "$"
      , "|"
    ];

    const rgxEscaper = RegExp('[' + specials.join('\\') + ']', 'g');

    args = args.replace(rgxEscaper, "\\$&");

    // Match in a case insensitive maneer
    const re = new RegExp(`\\\\?${args}` + `(?!([^<]+)?>)`, 'g');
    const match = value.match(re);

    // If there's no match, just return the original value.
    if (!match) {
      return value;
    }

    const replacedValue = value.replace(re, "<mark>" + match[0] + "</mark>")
    return this.sanitizer.bypassSecurityTrustHtml(replacedValue)
  }

组件:

@Component({ 
  selector: 'my-app',
  styleUrls: ['./app.component.css'],
  template: `
    <label for="search-term">Search</label>
    <input placeholder="Enter term" (input)="updateSearch($event)" id="search-term">
    <div [innerHTML]="results | highlight: searchTerm"></div>
  `,
})
export class AppComponent {
  results: string;
  searchTerm: string;
  constructor() {
    this.results =  '"1. Local currency (Kwanza-AOA): up to AOA 50,000.- for residents and non-residents.<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />2. Foreign currencies:<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />a. Residents (older than 17 years): up to USD 15,000.- or equivalent;<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />b. Residents (younger than 18 years): up to USD 5,000.- or equivalent;<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />c. Non Residents (older than 17 years): up to USD 10,000.- or equivalent;<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />d. Non Residents (younger than 18 years): up to USD 3,000.- or equivalent. <br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />Exempt: <br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />- If holding a letter (certified by B.N.A./D.O.I.) from a company or entity which took care of payment of all expenses during stay in Angola: foreign currencies up to the amount imported.<br xmlns="http://www.opentravel.org/OTA/2003/05/beta" />- Amounts left with receipts of bills paid or money exchange vouchers. "'
  }
    updateSearch(e) {
    this.searchTerm = e.target.value
  }
}

我尝试过做类似的事情:

const re = new RegExp(`\\\\?${args}` + `(?!([^<]+)?>)`, 'gi');

它“技术上”有效。但这个特定解决方案的问题是,第一个匹配字符 ( match[0] ) 在突出显示时始终会转换为第一个字符实例。

有什么想法如何替换硬编码的 match[0] 返回值,以便它在突出显示时不会更改原始字符?

最佳答案

使用该函数返回替换文本:

const replacedValue = args ? value.replace(re, (match) => `<mark>${match}</mark>`) : value;

修改了您的Stack Blitz示例。

关于javascript - 如何获取 'Highlight Keyword' 管道来显示不区分大小写的匹配项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56880119/

相关文章:

javascript - polymer 1.4.0 至 1.7.0,全局 :root styles no longer work

javascript - 使用接口(interface)销毁对象

javascript - 将变量转换为json路径

正则表达式 ^\\d{4}-\\d{2}-\\d{2}$

asp.net-mvc - Angular2 Http 发布请求未绑定(bind)到 ASP.NET 5 Controller 的操作

Angular 2如何从嵌套组件冒泡事件

javascript - 为什么除了 1 条路由之外的所有路由都与 Backbone 路由器一起使用

php - 破折号和下划线的 preg_match 的奇怪行为

javascript - 带有特定字符串和之后任意数量字符的正则表达式

Angular 4;分页器的 "items per page"翻译