Поиск и выделение разных слов в двух строках в angular

#javascript #angular #typescript

#javascript #angular #typescript

Вопрос:

У меня есть две строки

let old = "if(is_required(ABCD))then is_valid_numeric(ABCD,'3.0')";

let new = "if(is_required(PQR))then is_valid_numeric(PQR,'3.0')";

в приведенных выше двух строках единственным отличием является PQR в новой строке, поэтому я хочу выделить PQR желтым цветом.

Также могут возникнуть другие варианты использования, которые изображены на рисунке ниже

введите описание изображения здесь

Я попробовал ниже approch в angular pipe.

 import { Pipe, PipeTransform } from '@angular/core';

@Pipe({name: 'highlighter'})
export class Highlighter implements PipeTransform {
  transform(value, ...args: any[]): number {
    if(!args[0]) return value;
    let text = '';
    value.split('').forEach((val,i)=>{
       if(val != args[0].charAt(i)){
         text  ="<span class='highlight'>"   val   "</span>";
       } else {
        text  =val;
       }
    });
    return text;
  }
}
 

HTML

 <p [innerHTML]="new | highlighter:old"></p>
 

вышеупомянутый подход использует проверку символов, которая не будет работать, если строки имеют разную длину.

Stackblitz

Комментарии:

1. При каком условии вы хотите выделить текст?

2. выделите различия в новой строке

3. angular-ivy-spggeq.stackblitz.io это то, что вы ищете?

4. stackblitz не загружается .. не могли бы вы, пожалуйста, опубликовать ссылку еще раз

5. открыть angular-ivy-spggeq.stackblitz.io перейдите по этой ссылке и нажмите на run this project кнопку

Ответ №1:

Совет: «прежде чем копировать и вставлять, попробуйте понять код»

Канал работает, создавая массив word с использованием split (‘ ‘) и сравнивая элементы массива со «словами», поэтому в вашем примере массив становится

 ['if(isrequired(MEQ_NUM))','then','isvalid'...]
 

Таким образом, любое слово — «MEQ_NUM»

Вам нужно изменить свой канал, используйте что-то вроде:

 export class Highlighter  implements PipeTransform {
  transform(value: string, ...args: any[]): string {
    if (!args[0])
      return value;
    args.forEach(x=>{
      value=value.split(x).join('<span class="highlight">'   x   '</span>')
    })
    return value
  }
}
 

Убедитесь, что этот канал «разделен» собственным словом, и соедините с <span class=...></span>

В предыдущем примере массив, который создается

 ["if(isrequired(',")', then isvalid"...]
 

Соединение выполняет «трюк», стекблитц

Комментарии:

1. Я хочу подчеркнуть разницу между двумя строками. в приведенном выше коде, где выполняется сравнение? В аргументе канала я передаю старое значение строки, поэтому в аргументах [0] я получаю старое значение. Я отредактировал вопрос и также включил stackblits. Приведенный выше канал, который вы реализовали, просто выделяет слова, переданные в качестве аргументов. Мне нужна фактическая разница между двумя строками. stackblitz.com/edit /…

2. извините, я не понял вашего вопроса: (

3. например, в двух строках ниже let old = "if(is_required(ABCD))then is_valid_numeric(ABCD,'3.0')"; , и let new = "if(is_required(PQR))then is_valid_numeric(PQR,'3.0')"; единственным отличием является PQR в новой строке. Поэтому просто хочу выделить PQR. Примечание: эти строки являются динамическими