Найти sla sh между 2 строками, которые не находятся внутри строки URL - PullRequest
0 голосов
/ 27 апреля 2020

Я ищу метод / регулярное выражение, чтобы найти sla sh между 2 строками и добавить к нему (пробел). Я хочу исключить html теги и URL-адреса из этого.

Я пытался \/(?![^<>]*>) найти / заменить sla sh, что также исключает html теги.

string.replace(new RegExp('\/(?![^<>]*>)', 'gm'), '/&nbsp;');

Что я могу сделать, чтобы исключить URL-адреса также из этого регулярного выражения?

RegexTester: https://regex101.com/r/40DzZP/1

Пример:

IN

1.) test1/test2
2.) <span>test1/test2</span>
3.) www.test1.com/test2
4.) www.test1.com/test2/test3
5.) <a>www.test1.com/test2</a>
6.) <a>www.test1.com/test2/test3</a>
7.) test1/test2 www.test1.com/test2 test3/test4
8.) <div>test1/test2 www.test1.com/test2 test3/test4</div>

OUT

1.) test1/&nbsp;test2
2.) <span>test1/&nbsp;test2</span>
3.) www.test1.com/test2
4.) www.test1.com/test2/test3
5.) <a>www.test1.com/test2</a>
6.) <a>www.test1.com/test2/test3</a>
7.) test1/&nbsp;test2 www.test1.com/test2 test3/&nbsp;test4
8.) <div>test1/&nbsp;test2 www.test1.com/test2 test3/&nbsp;test4</div>

Заранее спасибо.

1 Ответ

0 голосов
/ 27 апреля 2020

Входная строка выглядит как HTML, вы можете проанализировать ее как HTML, go через все узлы, разделить текст узлов на другой компонент и обработать все эти компоненты, если они не являются URL-адресами, вот пример:

const input = `test1/test2
<span>test1/test2</span>
www.test1.com/test2
www.test1.com/test2/test3
<a>www.test1.com/test2</a>
<a>www.test1.com/test2/test3</a>
test1/test2 www.test1.com/test2 test3/test4
<div>test1/test2 www.test1.com/test2 test3/test4</div>`;

const urlRegExp = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/i

const doc = new DOMParser().parseFromString(input, "text/html");
[...doc.body.childNodes].forEach((c) => {
  const splitted = c.textContent.split(" ");
  const processed = splitted.map(part => {
    if (!urlRegExp.test(part.trim())) {
      return part.replace(/\//g, "xxxx")
    }
    return part;
  });
  c.textContent = processed.join(" ");
});

const output = doc.body.innerHTML.replace(/xxxx/g, "/&nbsp;");

console.log(output);

Вы можете изменить urlRegExp Я не уверен, соответствует ли он всем действительным URL-адресам или имеет ложные срабатывания.

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