Глава 3
Допустим вы хотите удалить из файла html все теги со специальными символами; предполагается, что после удаления останется примерно тот же текст, который отображался в браузере, но только в виде простого текстового файла.
В следующем примере для решения этой задачи используется функция erase():
Вверх
string& stripHTMLTags(string& s) {
int main(int argc, char* argv[]) {
Анализ:
Программа удаляет даже теги html, занимающие несколько строк. Для этого используется статический флаг inTag, которому присваивается true, если при обнаружении начального тега парный завершающий тег не был обнаружен в той же строке. В функции stripHTMLTags() встречаются все формы функции erase().
Используемая версия getline() представляет собой глобальную функцию, объявленную в заголовочном файле <string> она удобна тем, что в аргументе string может храниться строка произвольной длины. Нам не приходится беспокоиться о размерах символьного массива, как при использовании функции stream::getline().
В программе задействована функция replaceAll(), упоминавшаяся ранее в этой главе. В следующей главе будет создано более элегантное решение с применением строковых потоков.
Назад |
Начало урока |
Вверх |
Вперед
//: C03:HTMLStripper.cpp {RunByHand}
//{L} ReplaceAll
// Фильтр для удаления тегов и маркеров HTML
#include <cassert>
#include <cmath>
#include <cstddef>
#include <fstream>
#include <iostream>
#include <string>
#include "ReplaceAll.h"
#include "../require.h"
using namespace std;
bool done = false;
while (!done) {
// Продолжаем поиск '>'.
size_t rightPos = s.find('>');
if (rightPos != string::npos) {
s.erase(0, rightPos + 1);
else {
s.erase();
else {
size_t leftPos = s.find('<');
if (leftPos != string::npos) {
size_t rightPos = s.find('>');
if (rightPos == string::npos) {
s.erase(leftPos);
else
else
// Удаление всех специальных символов HTML
replaceAll(s, "& lt;", "& lt");
replaceAll(s, "& gt;", "& gt");
replaceAll(s, "& amp;", "&");
replaceAll(s, "& nbsp;", " ");
// E o. a.
return s;
ifstream in(argv[1]);
assure(in, argv[1]);
string s;
while(getline(in, s))
Результат:
Содержание