allg/html.cpp

Das folgende Code-Beispiel stammt aus dem Buch
Objektorientiertes Programmieren in C++ - Ein Tutorial für Ein- und Umsteiger
von Nicolai Josuttis, Addison-Wesley München, 2001
© Copyright Nicolai Josuttis 2001


#include <iostream>    // C++-Headerdatei für Ein-/Ausgaben
#include <string>      // C++-Headerdatei für Strings

int main ()
{
    const std::string anfang("http:");       // Beginn eines Links
    const std::string trenner(" \"\t\n<>");  // Zeichen, die den Link beenden
    std::string zeile;                       // aktuelle Zeile
    std::string link;                        // aktueller HTML-Link
    std::string::size_type anfIdx, endIdx;   // Indizes

    // für jede erfolgreich gelesene Zeile
    while (getline(std::cin,zeile)) {
        // suche erstes Vorkommen von "http:"
        anfIdx = zeile.find(anfang);

        // solange "http:" in der Zeile gefunden wurde,
        while (anfIdx != std::string::npos) {
            // Ende des Links finden
            endIdx = zeile.find_first_of(trenner,anfIdx);

            // Link extrahieren
            if (endIdx != std::string::npos) {
                // Ausschnitt von gefundenem Anfang bis gefundenem Ende
                link = zeile.substr(anfIdx,endIdx-anfIdx);
            }
            else {
                // Kein Ende gefunden: Rest der Zeile
                link = zeile.substr(anfIdx);
            }

            // Link ausgeben
            // - "http:" ohne weitere Zeichen ignorieren
            if (link != "http:") {
                link = string("Link: ") + link;
                std::cout << link << std::endl;
            }

            // weiteren Link in der Zeile suchen
            if (endIdx != std::string::npos) {
                // suche weiteres Vorkommen von "http:" ab gefundenem Ende
                anfIdx = zeile.find(anfang,endIdx);
            }
            else {
                // Ende war Zeilenende: kein neuer Anfang in der Zeile auffindbar
                anfIdx = std::string::npos;
            }
        }
    }
}