Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
C#. Удаление HTML-тегов из текста.

Т.е. остается только текст между тегами, например из:
<b>жирный текст</b> <a href="http://example.org">Это ссылка куда-то</a>
должно получиться
жирный текст Это ссылка куда-то

Регулярное выражение для HTML-тега


По счастью, оно совсем простое:

<[^>]+>

Пример


Не забываем подключить соответствующее пространство имен:
using System.Text.RegularExpressions;
//...
string htmlText = "<html><head><title>tolik-punkoff.com</title></head> <body>Welcome to Tolik Punkoff blog!</body></html>";
OutputText = Regex.Replace(htmlText, "<[^>]+>", string.Empty);

//Содержимое OutputText:
//tolik-punkoff.com Welcome to Tolik Punkoff blog!


Примечание: В примере между фразами пробелы, потому что есть пробелы между тегами. Функция никаких пробелов сама по себе не вставляет!

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/10/14/c-udalenie-html-tegov-iz-teksta/

Tags: ,
Comments
(Anonymous)

Ты где своих ботов держишь которые срут? Сервер арендуешь или с компа все работает?

Вот нахрена Мартинсам сервер? Еще б сказал "дата-центр". В прихожей я их держу.

(Anonymous)

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

А нахрена Мартинсам компьютер вообще? Им изредка только крем для обуви нужен, когда совсем по говну ходил.

(Anonymous)

Ты без компа значит ботов заимел? А что, так можно было?

Идешь в обувной магазин или на рынок и покупаешь. Комп-то зачем? Боты, их же померять надо, перед тем, как покупать. Не будешь же с алиэкспресс заказывать, вдруг не подойдут.

I see that you did there

А чё ты потёр анонские комменты, указывавшие на баг в твоём коде? Выяснилось, что предложенный аноном текст нормально обрабатывается твоей поделкой?

Re: I see that you did there

Не, серьёзно. Я не помню досконально ту строку, которую скинул анон.

Re: I see that you did there

Там, по моему была какая-то хуйня. Стер неглядя просто. Что там за код был?
У меня этот пример прекрасно удаляет все HTML-теги.

Re: I see that you did there

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

Re: I see that you did there

Ну хуй знает, там по-моему одна ругань была. Я ее и стер. Может, Кетмар зайдет, скажет, что не универсально... Но вроде работает.

Re: I see that you did there

Ругань-то там была, но была и разметка. So it goes.

Re: I see that you did there

Интересно, какая, конечно, но хуй с ней. Вроде этим паттерном обрабатываю довольно ебанутый HTML, пока сбоев не видел. Хотя использую для таблиц, вложенных в таблицы.

(Anonymous)
Re: I see that you did there

Да, хуйлашка такой, трёт и банит, трёт и банит...

Вот разметка:

<b>жирный текст</b> <a name=">Fuck off Tolik Punkoff" href="http://example.org">Это ссылка куда-то</a>

Кто сказал, что в значении атрибута не может быть знака >? Ещё как может быть!

Re: I see that you did there

Ну дык ругаться не надо, надо вежливо указывать на ошибки, ругань могу и стереть.

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

Кое-кто использует

Напоминаю, что символ ">" задаёт цитирование не только на движках имиджборд, но и на более цивильных сервисах. Так что какой-нибудь сверхразум может тиснуть >прямую цитату в качестве параметра тэга.

Re: Кое-кто использует

А, ну это отдельное дело, к парсингу HTML дело не имеющее, хотя вон Кетмар говорит, что регулярки вообще низзя! Но если большинству подходят - пусть будут, а комменты им в помощь, надо или не надо.

Госспидя, я или тупой, или туплю жестко. Можно в двух словах? (третий раз перечитываю, нихуя не понимаю). Имхо, тогда более лучшая регулярка, чтоб выкинуть из текста весь HTML будет такая:

<.*> (открывающая угловая скобка, любое количество символов внутри, закрывающая угловая скобка).

you.
absolutely.
cannot.
parse.
html.
with.
regexps.
never.
ever.
period.

Так мне и разбирать их не надо в данном случае. Надо их выкинуть к чертям. Значимые HTML-теги заменяются банальным Replace, который у объекта string есть из коробки. Остальные теги надо просто выбросить к хренам собачьим.

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

«нерегулярный язык».

Ну тогда для тегов получается, что это <.*> универсальное решение (чтоб их найти и/или удалить), а то что в посте, не универсальное, но работает для моего случая. Благодарю.

(вздыхает) нет, это тоже не работает. по тем же очевидным причинам, по которым не работает ЛЮБОЕ решение парзинга html регулярками. ВООБЩЕ ЛЮБОЕ. не. работают. не бывает вечного двигателя, не бывает парзера html на регулярках. они совершенно одинаково невозможны.

Но теги-то по любому оборачиваются в < и >? По-моему это даже в стандарте прописано. Внутри тега может быть хоть черт лысый, но сам тег из скобок не выползает, или я до сих пор чего-то не понял?

Ведь <a href="example.org" не валидный? Без закрывающей скобки?

тебе аноша привёл очевидный и простейший пример, когда это всё ломается. а этих примеров НАМНОГО больше. и да, ВНИЗАПНА закрывающий символ не обязательно «>». кури SGML. который — на удивление — тоже надо поддерживать. а также кури машины состояний для парзинга разных версий html (да, они разные, местами очень сильно) — узнаешь столько всего про то, какой html на свете бывает, что лучше бы этого никогда в жизни не знать. и даже если сервер, который генерирует html, который ты будешь разбирать, под твоим полным контролем — ты всё ещё в жопе. а если нет — то ты даже не в жопе, жопа для такой ситуации — счастье и радость.

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

а самое странное то, что совершенно непонятно: за каким чёртом тащить регулярки там, где в системе есть уже готовый html-парзер. у тебя целый веббраузерный движок под рукой, с доступом к dom и кучей методов манипуляции оным.

Да там надо-то фактически выдрать таблицу с указанной страницы. Я в первой версии и использовал WebKit, который вообще заход юзера эмулировал. Заходил, кнопочки js-ом нажимал, но оказалось, что у них CSV архива погоды запаздывает на почти сутки с HTML-страницей, с которой нужны данные. И ради этого тащить полноценный HTML-парзер или встраивать в проект движок браузера? Лучше я высосу страницу GET-запросом, потом вырежу оттуда таблицу (string.Substring), заменю в ней TR TD на | и перевод строки (string.Replace) и потом из текстового файла вытяну данные. Чтоб лишние HTML-теги не мешались и нужна была регулярка, которая их выкинет кхуям.

он (браузер) у тебя уже встроен, потому что в винде он всегда доступен.

В .NET 2.0 этот браузер довольно кривой (вроде как IE, который в системе), потому проще (если уж нужен браузер и никак иначе нельзя) использовать что-то стороннее.

ну и чем он кривой-то? у тебя есть конкретные претензии, или просто «все так говорят»?

Собственно, все претензии, что есть про просто IE. Плюс без бубна со стандартным WebBrowser (который и есть системный IE) ничего делать невозможно, кроме отображения простых HTML-страниц.

то есть, «все так говорят», и второе вовсе неверно, потому что каждый винтик ие доступен по com, и оно невероятно гибкое. даже если использовать com из сишечки, как делал я. а из крестов/шарпа и тем более.

Нет, IE довольно криво отображает большинство страниц. Из C# в компоненте WebBrowser хуй да маленько. Ну нахуй мне бы встраивать дополнительный компонент, который как игра Садкова, требует для запуска астероида с конкретным давлением и атмосферой, если бы WebBrowser работал?

(вздыхает) ну подумаешь, из шарпа есть практически прямой доступ к com. нет компонента, который можно мышечкой перетащить — всё, не существует.

Доступ конкретно к COM тот еще бубен. Но да, можно просто нарисовать кучу интерфейсов к COM, понаписать для того отдельных DLL и наслаждаться. Но не та задача. Вот с Telegram или каким-нибудь кошельком (например Emercoin) задача самая та.

давным давно всё написано. а что нет — то совершенно автоматически генерируется. потому что ком.

Ну если из того, что написано, WebKit вот... Хотя посмотрим дальше, как раз на носу большой проект с плотным взаимодействием с WWW.

Плюс еще нам Луну (которую за НЛО принимают) и Венеру отсеивать надо, желательно автоматически, а то мы утонем в сообщениях об НЛО. Фактически утонем. Если все печатать, то комната заполнится за неделю, уж не знаю, как Космопоиск справлялся. Благо NASA дало нам бесплатный API, где мы можем отслеживать Луну, Венеру, Марс, Юпитер и Сатурн.

(Anonymous)

Нахуя ты вообще с этим дебилом общаешься? А да, потому что ты сам такой же тупой кусок говна )))

потому что лично мне ничего плохого не делал. и в отличие от реально дебилов — задаёт вопросы, а не настаивает что сам всё знает и прав. этого минимума уже достаточно, чтобы отвечать.

а что человек не знает ничего про грамматики — так он потому и спрашивает, что не знает. знал бы — не спрашивал. логично, что он не имеет опыта, не знает, и поэтому не видит, почему его варианты кривые.

вопреки общераспространённому мнению, человек эволюционировал не потому что «трудился», а потому что думал и учился. поэтому не вижу причины не помочь тому, кто просит с уважением.

так-то.

повторю ещё раз: синтаксис html не является регулярным. он математически не может быть обработан при помощи инструментов для работы с регулярным синтаксисом. никогда и никак. вообще. без исключений. любая попытка это сделать заведомо ошибочна. а если ты уверен, что «для моего случая достаточно и сойдёт», ты фатально ошибся уже как минимум два раза.

а интересно тогда, как делают парзеры HTML? Ну тот же движок браузера, он же нам не HTML, а форматированный текст кажет. Вот это и правда интересно. Если у него внутри не регулярные выражения, то что?

так же, как и все остальные парзеры — ручками по грамматике. разбиваем входной поток на токены, из токенов делаем семантические единицы, потом анализ семантических единиц. конкретных видов реализаций много, но ни одна из них не базируется на регулярных выражениях, потому что это невозможно. регулярные автоматы (МНОГО РАЗНЫХ) могут использоваться для разных состояний токенизатора, и токенизатор активно их переключает в зависимости от своего внутреннего самоощущения.

*Хватается за голову*

Бля, люди, что ж вы курили когда это делали, и как теперь это глубоко понять, если будет надо (не дай Ктулху).

да как обычно: берём книжки, читаем. например, берём Драконью Книгу, штудируем разделы про парзеры.

Что за Драконья Книга? Дай ссылку, коли нивпадлу.

Блин, а как ты в тему подошел! Мне как раз в новом проекте будет нужен "мини-язык", я наверное просто жестко забью команды в БД и сам "язык" сделаю, как выборку из БД но все равно спасибо.

На полноценный парсер меня не хватит, тем более в сроки.

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

Ну если найду в хорошем переводе то да. А так я уже примерно прикинул, чтоб не парзить плейнтекст - взять и команды (их немного) забить в качестве 1 поля БД, параметры - во втором, вот и весь пирог с котятами.

(Anonymous)

>если найду в хорошем переводе

Дичайше проиграл! "Гений" хуйлашка до сих пор не смог осилить простенький английский. Это пиздец, ор выше гор сука )))))

Не гений. Но сложные вещи действительно не могу. Не горжусь, но и не парюсь по сему поводу. Даже в закон Ома и то не все могут.

и да: это значит ровно то, что я написал: там нет ничего сложного. любая известная технология простая. сложности от того, что во-первых, люди убеждают себя, что нечто сложно, а во-вторых, часто изучают в неправильном порядке, не имея базового понимания, но пытаясь запрыгнуть на продвинутое. главы Драконьей Книги про парзинг достаточны, просто не надо ничего пропускать, и не надо бежать дальше, пока не понял то, что написано до этого. Драконья Книга — именно учебник.

Вот если учебник - тогда лучше медленно читать и делать примеры. Тогда будет просто, может и поумнею. А текущий проект пока сделаю не на парсинге, а на фиксированных командах, занесенных в БД. Парсинг, на самом деле, делает примерно тоже самое, но БД там скрытая, как я понимаю.

Фактически я скачиваю с сервера таблицу в виде HTML, т.е. со всеми TR TD, потом преобразую ее в текстовый файл, которым кормится софтина.

you. cannot. it doesn't matter how hard you imply that you can. you cannot create perpetual motion machine, and you cannot process html with regexps. at least in our universe, with our laws of physics and mathematics.

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

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

Вот это да. Но тут уж или наша команда уфологов разбежится, или метеорологию экстремизмом признают, или я сдохну, или сервер с погодой. Все приведет к двум результатам, или код поменяется, или будет не нужен.

(Anonymous)

Ты не забывай, что твой обосранный визави не знает языков, кроме свинячей мовы.

запамятовал. но ничего страшного: однажды надоест читать через гуглотранслятор, и выучит. или нет, но это уже не мои проблемы. я неоднократно говорил, почему английский в объёме, достаточном как минимум для чтения технической литературы и общения на технических форумах, знать надо. (а в большем я и сам не знаю)

Буквально недавно озаботился тем же вопросом на Python. Сильно не советуют юзать регулярки, и предпочесть родную либу по базовому парсингу HTML.

Да вон уже тут Ketmar и очень даже в кассу насоветовал. Но то, что уже написано, пусть будет и написано через оперную диву, а то, что будет написано... Ну учту, если успею и меня в жопу тыкать не будут. А то как и с погодным информером, я строил, строил, и наконец мне все срочно сели на мозг, чтоб я сделал завтра и бесплатно (в смысле без накладных расходов, у меня-то зарплата - три).