Заменить строковую функцию обратного вызова в javascript

У меня есть большая строка 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)

но мне не удалось заменить очищенные ссылки обратно в строку документа.

Демо http://jsfiddle.net/ofbe3cr7/

Итак, вы думаете: заменить всего одну ссылку https://example.com/blog-link-1.html?q=123 на ?q=123?

Tân 20.11.2018 09:55

Если у вас есть доступ к функциям DOM, вы должны просто проанализировать HTML и использовать объект местоположения привязки. Это лучше, чем обычное регулярное выражение. developer.mozilla.org/en-US/docs/Web/API/Location

René 20.11.2018 10:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
374
1

Ответы 1

Вам не нужна функция замены - вместо этого захватывать первая часть 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, какие-либо ограничения для вашего первого решения? в любом случае, спасибо!

Hoknimo 20.11.2018 10:09

В вашем коде в вашем вопросе используется jQuery, и ваш вопрос не указывает на то, что вы на самом деле не можете использовать jQuery, поэтому я подумал, что все в порядке. Вы можете использовать парсер DOM для Node, чтобы реализовать второе решение. Первое решение неэлегантно и, вероятно, иногда неточно, но все равно должно работать в Node, единственный jQuery, который он использует, - это часть, которая отображает HTML

CertainPerformance 20.11.2018 10:12

почему иногда неточно?

Hoknimo 20.11.2018 13:46

Регулярные выражения в целом не очень надежны при синтаксическом анализе HTML. В этом случае нет ничего, что могло бы гарантировать, что ссылка https... находится внутри <a>, на который вы хотите настроить таргетинг - лучше вместо этого использовать правильный парсер DOM.

CertainPerformance 20.11.2018 21:19

Другие вопросы по теме