Строковые индексы до и после преобразования - PullRequest
0 голосов
/ 26 марта 2012

В Java у меня есть произвольный HTML-документ в виде строки. Для простоты скажем:

String original = "Hello, <strong>this</strong> is a string";

И у меня есть запись о различных местах в строке, всегда в тексте, а не в теге. Например, индекс начала и конца слова «is» равен 29 и 31.

Затем я выполняю преобразование строки - в этом случае удаляем теги HTML. Это оставляет:

original = "Hello, this is a string";

Есть ли элегантный способ получить новый начальный и конечный индексы слова "is" сейчас (12 и 14)?

Единственное возможное решение, которое я могу придумать, - это вставить «флаг» в каждый исходный индекс, удалить HTML, а затем удалить флаги во время записи их местоположений. Это не должно вызывать проблем с разметкой HTML, так как индексы всегда появляются вне тегов.

Если это действительно лучший способ, есть ли у кого-нибудь рекомендации по правильному выбору "флага", который определенно не будет совпадать ни в одном документе HTML?

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Лучший подход будет зависеть от того, как вы удаляете теги HTML. Если вы просто удаляете все, что заключено в <> скобки, то вы можете просто перебрать старую строку и сохранить количество всего, что находится за скобками <>, предшествующими старому индексу. Возможно, что-то в этом роде будет работать:

public String newIndex(String str, int oldIndex) {
  int newIndex = 0;
  boolean inBracket = false;
  for (int i = 0; i < str.length(); i++) {
    if (i == oldIndex) return newIndex;
    char c = str.charAt(i);
    if (c == '<') inBracket = true;
    else if (c == '>') inBracket = false;
    else if (!inBracket) newIndex++;
  }
  return newIndex;
}
1 голос
/ 26 марта 2012

Не совсем.Основная проблема в том, что String является конечным (так что вы не можете расширить класс), и что в большинстве мест, где используется String, достаточно CharSequence (где вы могли бы фактически создать свою собственную реализацию).

Таким образом, у вас есть два варианта:

  1. Создание собственного кода для разметки HTML
  2. Повторная индексация документов после разметки тегов HTML

Если вам нужно только удалить HTML, то вы можете использовать это регулярное выражение: <[^>]+> Это гарантированно сработает, если у вас нет блоков CDATA (которые вы можете проверить, просмотрев <![CDATA[) или встроенный JavaScript(ищите теги <script> без атрибутов src.

1 голос
/ 26 марта 2012

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

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