Как удалить тег объекта из моего HTML с помощью Java - PullRequest
0 голосов
/ 22 марта 2011

Привет! Я пытаюсь удалить тег объекта из содержимого HTML с помощью Java, чтобы я мог отображать HTML на устройствах, которые не поддерживают Flash

<object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50">
  <param name="BorderStyle" value="1" />
  <param name="MousePointer" value="0" />
  <param name="Enabled" value="1" />
  <param name="Min" value="0" />
  <param name="Max" value="10" />
</object>

Ответы [ 3 ]

0 голосов
/ 22 марта 2011

Вы можете просто использовать Tagsoup (http://ccil.org/~cowan/XML/tagsoup/),, который является xml-анализатором, который может читать из html, даже если он плохо отформатирован (не обязательно должен быть xhtml или даже соответствовать).

Тогда вы можете простоудалите все теги объектов, используя xpath.

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

0 голосов
/ 23 марта 2011

HTML-элемент OBJECT может быть вложенным. Поскольку в Java нет встроенного рекурсивного выражения регулярного выражения, вы не можете напрямую сопоставить самый внешний элемент OBJECT с одним регулярным выражением. Вы можете , однако, создайте регулярное выражение для соответствия внутреннему OBJECT элементу и выполняйте итерацию, заменяя их изнутри, пока не останется ничего. Вот проверенный фрагмент кода Java, который делает именно это:

String regex = "<object\\b[^>]*>[^<]*(?:(?!</?object\\b)<[^<]*)*</object\\s*>";
String resultString = null;
java.util.regex.Pattern p = java.util.regex.Pattern.compile(
            regex,
            java.util.regex.Pattern.CASE_INSENSITIVE |
            java.util.regex.Pattern.UNICODE_CASE);
java.util.regex.Matcher m = p.matcher(subjectString);
while (m.find())
{ // Iterate until there are no OBJECT elements.
    resultString = m.replaceAll("");
    m = p.matcher(resultString);
}
System.out.println(resultString);

ПРЕДОСТЕРЕЖЕНИЯ: Многие, несомненно, укажут: «Вы не можете анализировать HTML с помощью регулярных выражений!» И они верны (если ваше решение должно надежно работаю 100% времени). Хотя приведенное выше решение будет работать для многих случаев, имейте в виду, что оно имеет некоторые ограничения, и есть определенные вещи, которые могут его отключить, а именно:

  1. Начальный или конечный тег "<OBJECT...>" может не отображаться ни в одной из строк CDATA, таких как теги SCRIPT или STYLE, а также в любом атрибуте тега или в любом HTML-комментарии. например <p title="evil <OBJECT> attribute"> или <SCRIPT>alert("Bad <OBJECT> script here!");</SCRIPT>, или <!-- <OBJECT> inside a comment -->.
  2. Начальный тег <OBJECT> может не содержать угловых скобок в своих атрибутах.

Эти особые случаи должны быть довольно редкими, и приведенный выше код должен нормально работать для большинства (если не всех) HTML-файлов, которые у вас есть.

0 голосов
/ 22 марта 2011

Это регулярное выражение должно сделать трюк:

<\/?object(\s\w+(\=\".*\")?)*\>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...