Как заменить разные слова в тексте уникальным значением в Javascript? - PullRequest
1 голос
/ 16 января 2020

Я хочу заменить многие слова (или фразы) на одно и то же значение в тексте, используя функцию RegExp () javascript. Он заменяет отдельные слова на правильные значения, но когда ему нужно заменить фразу, содержащую то же слово, это не работает (ИДК, как это будет работать).

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

«Активность пациента соответствует недельным минутам активности»

Но он просто заменяет активность

Как я это делаю:

У меня есть ключевые слова. js файл где я получаю все фразы внутри объекта, структурированного так:

let keywords: {
    "activity": {
        phrases: ['activity']
    },
    "sleep": {
        phrases: ['sleep']
    }
}

и в моем разделе javascript в моем html:

@section('javascript')
    <script type="application/javascript" src="{{ asset("js/keywords.js") }}"></script>
    <script>
    $(function () {
       @if($patient)
          let patient = {
              weight: 60,
              height: 70,
              'currents' : {
                  "activity" : 100,
                  "sleep" : 60
              },
          }
          let t = $("#text-section-article").html(t); //the text where i want to look for word/phrases

          Object.entries(keywords).forEach(([key, values])=>{
          //Im iterating all over the keywords words
              Object.entries(values).forEach(([phraseKey, phraseValue])=>{
              //Im iterating all over the phrases
                  if(patient.currents.hasOwnProperty(key)){
                  //If my patient have activity in my object 'currents' I put a tooltip to that word in my body text by replacing it in this way.
                  title = `Your current ${phraseValue} is ${patient.currents[key]}`; //Your current activity is 100
                  t = t.replace(new RegExp(key, 'gi'), '<span data-toggle="tooltip" title="' + title + '" class="tip ' + phraseValue + '">' + phraseValue + '</span>');
                  }
              });       
       });
       $("#text-section-article").html(t);
       @endif
    });
    </script>
@endsection

В этом случае в моей статье текст все активность слова теперь имеют всплывающую подсказку, показывающую его текущее значение.

Что я хочу сделать, это добавить больше слов и фраз к объекту моих ключевых слов следующим образом:

let keywords: {
    "activity": {
        phrases: ['activity', 'Weekly activity minutes']
    },
    "sleep": {
        phrases: ['sleep', 'Sleep minutes']
    }
}

, чтобы заменить все эти фразы (если они существуют) в тексте моей статьи тем же значением o f терпеливый объект.

У меня плохое время с этим, и я буду очень признателен, если вы поможете мне найти способ справиться со всем, что я описал, и если есть простой / лучший способ справьтесь, просто дайте мне знать.

Спасибо за чтение!

1 Ответ

0 голосов
/ 16 января 2020

Я не уверен, возможно ли это сделать с помощью регулярного выражения, но вы можете сделать следующее:

Сначала вам нужно отсортировать фразы от самых длинных до самых коротких. Таким образом, вы сначала собираете все фразы, которые могут содержать более короткие. Так что если у вас есть

['activity', 'Weekly activity']

, он должен стать

['Weekly activity', 'activity']

Затем вам нужно разбить исходную строку на массив, чтобы вы могли перебирать и искать фразы.

['The', 'activity', 'patient', 'is', 'correspond', 'to', 'Weekly', 'activity', 'minutes']

Идея состояла бы в том, чтобы преобразовать исходный массив в следующее:

['The', 'activity', 'patient', 'is', 'correspond', 'to', 'Weekly activity minutes']

Там, где у нас больше нет отдельных слов, но фраз. При поиске этих фраз вы также должны записать индекс, в котором фраза может быть найдена в массиве результатов.

На данный момент все, что вам нужно сделать, - это перебрать массив результатов, проверить, записали ли вы индекс для текущей фразы, и если это так, вы заключаете его в элемент <span>, если нет, то просто пропускаете его. Последним шагом будет объединение каждой фразы в результате в строку.

Вот демоверсия jsfiddle: https://jsfiddle.net/tara5/43gcz0mx/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...