Как удалить разметку HTML, кроме текста полностью вне каждого тега? - PullRequest
0 голосов
/ 24 июня 2010

Я нахожусь в ситуации, когда у меня есть HTML-разметка с некоторым текстом за ее пределами (начальный или конечный). Какое регулярное выражение я должен использовать? Например:

some text over here
<Html>
<Title>website</Title>
<Body>
text text text
<Div>xxxxx</Div>
</Body>
</Html>
ending text

Итак, я должен получать только «некоторый текст здесь» и «конечный текст» .... Весь html + текст внутри каждого тега не должен вычитаться.

Другой пример:

abcdef<div>xyz</div>

Должно возвращаться "abcdef"

Любой подход или предложение будет с благодарностью. Спасибо

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

Лично я бы не использовал регулярные выражения для этого.Я не знаю, есть ли у вас альтернатива, но если вы можете загрузить фрагмент HTML в какой-то DOM, тогда вы сможете легко найти все теги и дочерние элементы и удалить их.

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

^(.*?)<.*>(.*?)$ с совпадением первой и второй скобоктекст, который вы хотите.Однако, если у вас может быть

text<b>HTML</b>text<b>HTML</b>text

И, конечно, худшие сценарии многократного вложенного HTML, где вы хотите, чтобы вывод был "texttexttext", тогда регулярные выражения, вероятно, будут очень сложными.

1 голос
/ 02 ноября 2010

Не используйте регулярные выражения для анализа (X) HTML!

Вместо этого используйте синтаксический анализатор XML. Возможно, HtmlCleaner поможет? Из этого ответа следующий фрагмент кода иллюстрирует синтаксис.

TagNode root = htmlCleaner.clean( stream );
Object[] found = root.evaluateXPath( "//div[id='something']" );
if( found.length > 0 && found instanceof TagNode ) {
    ((TagNode)found[0]).removeFromTree();
}

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

0 голосов
/ 24 июня 2010

Поиск

(.*?)<.*>(.*?)

и заменить на

$1 $2

Это должно быть сделано при условии, что текст до или после HTML-документа никогда не содержит <или>. Если это возможно, все становится немного сложнее. В зависимости от того, каким будет файл, вы можете удалить все, начиная от начального тега HTML или типа документа вплоть до конечного тега HTML (игнорировать регистр):

(.*?)<(doctype|html).*</html>(.*?)

и заменить на

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