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% времени). Хотя приведенное выше решение будет работать для многих случаев, имейте в виду, что оно имеет некоторые ограничения, и есть определенные вещи, которые могут его отключить, а именно:
- Начальный или конечный тег
"<OBJECT...>"
может не отображаться ни в одной из строк CDATA
, таких как теги SCRIPT или STYLE, а также в любом атрибуте тега или в любом HTML-комментарии. например <p title="evil <OBJECT> attribute">
или <SCRIPT>alert("Bad <OBJECT> script here!");</SCRIPT>
, или <!-- <OBJECT> inside a comment -->
.
- Начальный тег
<OBJECT>
может не содержать угловых скобок в своих атрибутах.
Эти особые случаи должны быть довольно редкими, и приведенный выше код должен нормально работать для большинства (если не всех) HTML-файлов, которые у вас есть.