Java заменить ссылку в теге

У меня есть

String s = "<a href="https://stackoverflow.com">https://stackoverflow.com</a><br/><a href="https://google.com">https://google.com</a>"

Теперь я просто хочу заменить все ссылки в атрибутах href префиксом с фиксированным значением (например, `abc.com?'). Вот результат, который я хочу:

String s = "<a href="abc.com?url=https://stackoverflow.com">https://stackoverflow.com</a><br/><a href="abc.com?url=https://google.com">https://google.com</a>"

Я попробовал следующее, но это не решает проблему, потому что заменяет все строки, начинающиеся с http://, а не только те, которые находятся в атрибутах href:

s= s.replaceAll("http://.+?(com|net|org|vn)/{0,1}","abc.com" + "&url=" + "$0");

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


person Hoang Nam    schedule 02.06.2017    source источник
comment
Используйте парсер HTML. И вообще, попробуйте написать программу, которая следует вашим определениям: ищите href, а не http.   -  person RealSkeptic    schedule 02.06.2017


Ответы (2)


Вы можете использовать синтаксический анализатор HTML, например JSoup.

String s = "<a href="https://stackoverflow.com">https://stackoverflow.com</a>";
Document document = JSoup.parse(s);
Elements anchors = document.getElementsByTag("a");
anchors.get(0).attr("href", "...new href...");

В качестве альтернативы, если это слишком большой вес, должно быть достаточно регулярного выражения:

<a href="(?<url>[^"]+)">(?<text>[^<]+)<\/a>

Обратите внимание, если вам не нужна группа text, замените ?<text> на ?:

Просто замените группу url и text, используя подход, аналогичный этому ответу.

person Eduardo    schedule 02.06.2017

Как сказал RealSkeptic, ищите href вместо самой ссылки, это экономит много усилий.

var s = '<a href="http://stackoverflow.com">https://stackoverflow.com</a><br/><a href="https://google.com">https://google.com</a>';

s = s.replace(/href="/g,"href=\"abc.com&url=" );

console.log(s);

person Peter-Paul    schedule 02.06.2017