Заменить строку глобально, используя проверяемый - PullRequest
3 голосов
/ 07 августа 2020

Я пытаюсь заменить строку глобально, используя переменную, но получаю неожиданную замену при ее замене. Я искал ту же проблему, но не нашел решения, поэтому публикую здесь. Может быть, вы, ребята, приведете меня туда, где я делаю ошибку.

Вот случай:

  1. У меня есть тело письма HTML и список ссылок, которые я ' ve извлечен из тела письма и сохранен как массив.
  2. Я пытаюсь перебрать массив ссылок и попытаться найти совпадение в теле письма.
  3. И когда я используя метод replace() для замены ссылки путем добавления некоторого префикса.

Выглядит довольно прямолинейно, не так ли?

Вот проблема, которую я получаю при замене ссылок.

Есть несколько повторяющихся ссылок. При попытке заменить их префиксом, он заменяется 2 раза.

например,

prefix = 'http://this.prefix?redirect_uri='
link = 'http://google.com'

// Expected Output
http://this.prefix?redirect_uri=http://google.com

// Getting Output
http://this.prefix?redirect_uri=http://this.prefix?redirect_uri=http://google.com

Вы можете видеть, что префикс повторяется.

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


let mailBody = `
<div dir="auto">
  <a href="https://aabc.pagerduty.com/incidents">aabc.pagerduty.com</a>
  <a href="https://aabc.pagerduty.com/incidents/P9X3024">[FIRING:1] TooManyContainerRestarts (http 10.0.95.123:8080 kube-state-metrics newton newton/prometheus-operator-prometheus prometheus-operator-kube-state-metrics infra critical) </a></p>
  <a href="https://aabc.pagerduty.com/incidents/P9X3024">View Incident</a>
  <p>URGENCY </p>
</div>
`;

const links = [
  'https://aabc.pagerduty.com/incidents',
  'https://aabc.pagerduty.com/incidents/P9X3024'
]

const processTrackingLinks = (linkArray, mailBody) => {
  const prefix = 'https://test.io?redirect_uri=';
  // const mapping = [];
  for (let i=0; i < linkArray.length; i++){
    const replacer = new RegExp(linkArray[i], 'g')
    mailBody = mailBody.replace(replacer, prefix + linkArray[i]);
  }

  return mailBody;
};

mailBody = processTrackingLinks(links, mailBody);

console.log(mailBody);

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

Любое разрешение будет оценено. :)

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Проблема заключается в массиве ссылок, который вы используете. Двойная замена связана с тем, что «https://abc.pagerduty.com/incidents» является подстрокой «https://abc.pagerduty.com/incidents/».

Вместо этого используйте следующий массив:

let links = [
  'https://abc.pagerduty.com/incidentsgoogle',
  'https://abc.pagerduty.com/incidents/',
  'https://abc.facebook.com'
];

Как уже было замечено, этот подход не работает для строк с подстрокой, присутствующей в массиве ссылок.

Чтобы избежать таких проблем, измените функцию процесса на:

const process = (links, mailBody) => {
  let prefix = 'http://test.io?redirect_uri='
  return mailBody.replace(/( href=["'])/g, "$1" + prefix);
};
1 голос
/ 07 августа 2020

Как насчет такого подхода. Вам больше не нужен массив links.

const process = mailBody => {
    return mailBody.replace(/href="/g, `href="http://test.io?redirect_uri=`)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...