У меня есть большая строка HTML, что-то вроде
<p>content</p>
<img src = "example.jpg"/>
<p>another paragraph</p>
<a href = "https://example.com/about-me.html?q=23424">about</a>
<a href = "https://example.com/blog-link-1.html?q=123>blog</a>
и что мне нужно сделать, так это очистить ссылки, но вернуть всю строку html. Я могу использовать регулярное выражение для очистки ссылки (удалить после? Q = 123),
const str = `<p>content</p>
<p>another paragraph</p>
<a href = "https://example.com/about-me.html?q=23424">about me</a>
<br />
<a href = "https://example.com/blog-link-1.html?q=123">blog</a>`
const result = str.replace(/https.*.html/g ,function(a) {
return a //what to do here?
})
console.info(result)
$('#content').html(result)
но мне не удалось заменить очищенные ссылки обратно в строку документа.
Если у вас есть доступ к функциям DOM, вы должны просто проанализировать HTML и использовать объект местоположения привязки. Это лучше, чем обычное регулярное выражение. developer.mozilla.org/en-US/docs/Web/API/Location



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам не нужна функция замены - вместо этого захватывать первая часть URL-адреса в группе, затем совпадение остальная часть URL-адреса с отрицательным набором символов, а затем замените все совпадение первой совпавшей группой (т. Е. первая часть URL):
const str = `<p>content</p>
<p>another paragraph</p>
<a href = "https://example.com/about-me.html?q=23424">about me</a>
<br />
<a href = "https://example.com/blog-link-1.html?q=123">blog</a>`
const result = str.replace(/(https.*?\.html)[^"]+/g, '$1')
$('#content').html(result)<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "content"></div>Тем не менее, было бы более элегантно и управляемо сделать это только с помощью jQuery, а не просто регулярным выражением в строке HTML: найдите <a> на .find и при необходимости замените их href:
const str = `<p>content</p>
<p>another paragraph</p>
<a href = "https://example.com/about-me.html?q=23424">about me</a>
<br />
<a href = "https://example.com/blog-link-1.html?q=123">blog</a>`
const $html = $(str);
$html.find('a').each((_, a) => {
a.href= a.href.replace(/(https.*?\.html)[^"]+/g, '$1')
});
$('#content').html($html)<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "content"></div>Я должен сделать это с помощью node.js, не думаю, что хочу делать это с помощью jquery, какие-либо ограничения для вашего первого решения? в любом случае, спасибо!
В вашем коде в вашем вопросе используется jQuery, и ваш вопрос не указывает на то, что вы на самом деле не можете использовать jQuery, поэтому я подумал, что все в порядке. Вы можете использовать парсер DOM для Node, чтобы реализовать второе решение. Первое решение неэлегантно и, вероятно, иногда неточно, но все равно должно работать в Node, единственный jQuery, который он использует, - это часть, которая отображает HTML
почему иногда неточно?
Регулярные выражения в целом не очень надежны при синтаксическом анализе HTML. В этом случае нет ничего, что могло бы гарантировать, что ссылка https... находится внутри <a>, на который вы хотите настроить таргетинг - лучше вместо этого использовать правильный парсер DOM.
Итак, вы думаете: заменить всего одну ссылку
https://example.com/blog-link-1.html?q=123на?q=123?