logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak usunąć znaczniki HTML z pliku w Turbo Pascal?

Pfikusny 01 Lis 2003 15:07 1413 8
REKLAMA
  • #1 382769
    Pfikusny
    Poziom 18  
    Posty: 381
    Ocena: 7
    Mam dorbny problemik...
    Na laborke mam napisac programik, ktory ma wywalic z danego pliku wszystkie znaczniki htmla....
    (zakladajac ze znacznik miesci sie miedzy < a >)...
    Musze sie jeszcze tylko dowiedziec, ale to i tak juz wielkich zmian w programie nie bedzie wymagalo czy nie lepiej gdyby znacznik traktowac jako to miedzy '<' a '/>'...

    No ale mam dorbny problem...
    Pisalem juz kilkanascie wersji tego programu ale ciagle pojawial sie jakis problem...

    Slowny opis algorytmu (narazie zakladajac brak 'zlosliwcow' w stylu tekstu z < czy>):
    Program wyszukuje w tekscie znaku < potem > i to co miedzy nimi to znacznik do wywalenia - czyli np. moge to napisac:
    ...
    dlugosc:=length(tekst);
    for a:=1 to dlugosc do
    begin
    znak:=copy(tekst,a,1);
    if znak= '<' then
    for b:=a to dlugosc do
    begin
    znak2:=copy(tekst,b,1);
    if znak2='>' then
    begin
    dlugosc:=b-1+1; {dlugosc znacznika}
    delete(tekst,a,dlugosc); {wywalanie znacznika}
    end;
    end;
    end;
    end;

    ...
    no dobra tylko ze jak widac program nie bedzie dzialal tak jak trzeba ;(

    choc popprzednia wersja najbardziej mi sie podoba postanowilem jednak sprobowac inaczej....

    Ponizej zamieszczam inna wersje programu:

    uses crt;

    var
    plik1:text;
    sciezka1:string;
    tekst:string;
    dlugosc:integer;
    a,b:integer;
    znak1,znak2:string;
    znacznik:string;


    BEGIN
    clrscr;
    write('Prosze podac sciezke: ');
    readln(sciezka1);
    assign(plik1,sciezka1);
    reset(plik1);
    read(plik1,tekst);
    a:=0;
    b:=0;
    repeat
    a:=a+1;
    znak1:=copy(tekst,a,1);
    until znak1='<';
    writeln('a: ',a);
    repeat
    b:=b+1;
    znak2:=copy(tekst,b,1);
    until znak2='>';
    writeln('b: ',b);
    dlugosc:=b-a+1;
    writeln('dlugosc wycinanego znacznika: ',dlugosc);
    znacznik:=copy(tekst,a,dlugosc);
    writeln('wycinany znacznik: ',znacznik);
    delete(tekst,a,dlugosc);


    writeln('pozostaly tekst: ',tekst);
    close(plik1);
    readln
    END.

    PROGRAM NIE DZIALA NARAZIE TAK JAK POWINIEN BO JEST W TRAKCIE PISANIA WIEC ZAPISANIE TEGO ZOSTAWIAM N DOPIERO NA KONIEC GDY JUZ BEDZIE DZIALAL POPRAWNIE...
    Jak mozna sprawdzic program dziala... ale tylko dla jednego znacznika... wiec zastanawiam sie jakby to zapetlic by bylo ok...

    Juz sam nie wiem co zrobic wiec prosze o pomoc!

    Program narazie jestpisany w TP ale w ostatecznej wersji ma byc to aplikacja konsolowa delphi - z przeksztalceniem nie bedzie raczej problemow.

    Czy ma ktos moze jakies propozycje??
    Chodzi tylko o jakas podpowiedz...
    Gdzie popelniam blad.. moze w rozumowaniu??

    Za wszelkie podpowiedzi z gory dziekuje ;)
  • REKLAMA
  • #2 382849
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Ja bym ten program napisał tak:

    repeat
    czytaj znak
    if znak='<' then ustaw znacznik
    if znak='>' then kasuj znacznik
    if not znacznik then zapis znak
    until koniec pliku
  • REKLAMA
  • #3 383587
    Pfikusny
    Poziom 18  
    Posty: 381
    Ocena: 7
    czyli cos w stylu:

    x:=0; a:=0; b:=0;

    dlugosc:=length(tekst);

    repeat
    x:=x+1;
    znak:=copy(tekst,x,1);
    if znak='<' then a:=x;
    if znak='>' then
    begin
    dlznacz:=x-a+1;
    delete(tekst,a,dlznacz);
    end

    until x>=dlugosc;

    niestety znowu wynik nie jest prawidlowy - znaczy sie wycina wiecej niz powinien ;(

    Pelen kod wyglada tak:
    uses crt;

    var
    plik1, plik2:text;
    sciezka1:string;
    tekst:string;
    dlugosc:integer;
    a,b,x:integer;
    znak:string;
    dlznacz:integer;

    BEGIN
    clrscr;
    write('Prosze podac sciezke: ');
    readln(sciezka1);
    assign(plik1,sciezka1);
    reset(plik1);
    read(plik1,tekst);
    x:=0; a:=0; b:=0;

    dlugosc:=length(tekst);

    repeat
    x:=x+1;
    znak:=copy(tekst,x,1);
    if znak='<' then a:=x;
    if znak='>' then
    begin
    dlznacz:=x-a+1;
    delete(tekst,a,dlznacz);
    end

    until x>=dlugosc;


    writeln(tekst);
    close(plik1);
    readln
    END.

    Jak narazie jeszcze nie zapisuje ale to jak bedzie gotowy...

    Ale niestety dalej bedzie to usowalo wiecej niz trzeba (tzn znaczniki i to co miedzy niektorymi...)
    ;(
    W tym punkcie zawsze padam...
    Co zrobic??
  • #4 383850
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Pfikusny napisał:
    czyli cos w stylu: [...]
    no właśnie żaden z tych ;) Ja Ci radziłem inaczej, nie operuj na stringach tylko na char`ze,
    1. czytaj char z pliku
    2. jesli < to ustaw znacznik
    3. jesli > to kasu znacznik
    4. jesli nie ma znacznika to wyslij znak do pliku wyjsciowego
    5. jesli nie koniec pliku to skocz do 1.
  • REKLAMA
  • #5 383866
    Pfikusny
    Poziom 18  
    Posty: 381
    Ocena: 7
    na char??
    eee ale jak to zrobic??
    Jak mam odczytac wartosc pliku tekstowego na char??
  • #6 383909
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Pfikusny napisał:
    Jak mam odczytac wartosc pliku tekstowego na char??
    read(plik,c) gdzie c:char
  • #7 384240
    Pfikusny
    Poziom 18  
    Posty: 381
    Ocena: 7
    ale char to przeciez pojedynczy znak wiec program odczytajeden znak z calego tekstu...
    Moznaby zmienic by zmienial za kazdym razem pozycje kursora ale ro ma dzialac w delphi a tam jak sie orientuje to sa jakies klocki ze zmiana pozycji kursora...
    Poza tym lepiej znam operacje na stringach niz na char'ach...

    Czy nie dalo by sie jakas usprawnic tego mojego programu??

    PS
    Czy ktos probowal prosic o utworzenie osobnego dzialu o programowaniu (oddzielic od mikrokontrolerow by byly same C pascal,java, html itp.??
  • REKLAMA
  • #8 384249
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Pfikusny napisał:
    ale char to przeciez pojedynczy znak wiec program odczytajeden znak z calego tekstu...
    Pierwszy odczyt odczyta pierwszy znak, kolejny drugi, następny odczyt trzeci itd. aż do końca pliku
    Pfikusny napisał:
    Czy ktos probowal prosic o utworzenie osobnego dzialu o programowaniu (oddzielic od mikrokontrolerow by byly same C pascal,java, html itp.??
    Moim zdaniem to spowoduje większy bałagan, BTW elektroda jest dla elektroników a nie informatyków ;)
  • #9 384945
    Pfikusny
    Poziom 18  
    Posty: 381
    Ocena: 7
    faktycznie - tak program dziala lepiej i jest czytelniejszy ;)
    teraz go jeszcze uodpornie na pare bledow :)

    Dziekuje za pomoc

Podsumowanie tematu

✨ Dyskusja dotyczy problemu usuwania znaczników HTML z pliku tekstowego w Turbo Pascal. Autor próbuje napisać program, który usuwa fragmenty tekstu zawarte między znakami < i >, czyli znaczniki HTML. Wstępne podejście polegało na operowaniu na całym stringu i usuwaniu podłańcuchów, co prowadziło do błędów i nieprawidłowego działania (usuwanie zbyt dużych fragmentów). Zaproponowano alternatywne rozwiązanie oparte na odczycie pliku znak po znaku (char), gdzie program ustawia flagę po napotkaniu < i kasuje ją po napotkaniu >, a znaki spoza znaczników są zapisywane do pliku wyjściowego. Autor miał wątpliwości, jak czytać plik znak po znaku w Turbo Pascal, co wyjaśniono poprzez użycie instrukcji read z typem char. Metoda ta okazała się bardziej czytelna i stabilna. Dyskusja porusza także kwestie związane z obsługą plików tekstowych w Turbo Pascal oraz sugestię utworzenia osobnego działu poświęconego programowaniu w różnych językach.
REKLAMA