Как бы удалить все атрибуты HTML в тегах HTML в строке - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь взять строку с HTML, удалить некоторые теги (img, object) и все другие теги HTML, удалить их атрибуты.Например:

<div id="someId" style="color: #000000">
   <p class="someClass">Some Text</p>
   <img src="images/someimage.jpg" alt="" />
   <a href="somelink.html">Some Link Text</a>
</div>

станет:

<div>
   <p>Some Text</p>
   Some Link Text
</div>

Я пытаюсь:

string.replaceAll("<\/?[img|object](\s\w+(\=\".*\")?)*\>", ""); //REMOVE img/object

Я не уверен, как удалить все атрибуты внутри тега, хотя.

Буду признателен за любую помощь.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 23 февраля 2012

Я бы не рекомендовал регулярное выражение для этого, если вы хотите фильтровать определенные теги. Это будет адская работа и никогда не будет полностью надежной. Используйте обычный HTML-анализатор, например Jsoup . Он предлагает API Whitelist для очистки HTML. См. Также этот документ поваренной книги .

Вот пример запуска с помощью Jsoup, который позволяет только теги <div> и <p> рядом со стандартным набором тегов выбранного Whitelist, который в приведенном ниже примере равен Whitelist#simpleText() .

String html = "<div id='someId' style='color: #000000'><p class='someClass'>Some Text</p><img src='images/someimage.jpg' alt='' /><a href='somelink.html'>Some Link Text</a></div>";
Whitelist whitelist = Whitelist.simpleText(); // Whitelist.simpleText() allows b, em, i, strong, u. Use Whitelist.none() instead if you want to start clean.
whitelist.addTags("div", "p");
String clean = Jsoup.clean(html, whitelist);
System.out.println(clean);

В результате

<div>
   <p>Some Text</p>Some Link Text
</div>

Смотри также:

7 голосов
/ 23 февраля 2012

Вы можете удалить все атрибуты следующим образом:

string.replaceAll("(<\\w+)[^>]*(>)", "$1$2");

Это выражение соответствует открывающему тегу, но захватывает только его заголовок <div и закрывающий > в качестве групп 1 и 2. replaceAll использует ссылки на эти группы, чтобы присоединить их обратно в выводить как $1$2. Это обрезает атрибуты в середине тега.

1 голос
/ 23 февраля 2012

/<(/?\w+) .*?>/<\1>/ может сработать - берет тег (соответствующую группу) и считывает любые атрибуты до закрывающей скобки и заменяет его только бэклетами и тегом.

0 голосов
/ 23 февраля 2012

Вероятно, будет намного проще, если вы используете SAX или DOM, берете имя и значение узла и удаляете все атрибуты.

...