Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam! Mam taki problem - zrobiłem kod php który wyciąga mi wszystkie linie z pliku html ze znacznikiem IMG
i wrzuca do pliku plik1.txt, wygląda on tak:
<?
$f0="<img";
$litera1 = $f0;
$fd = fopen("dokument.html", "rw+");
$fd1 = fopen("plik1.txt", "rw+");
while (!feof ($fd)){
$linia = fgets($fd, 1024);
if(strpos($linia, $litera1) !== false)
fputs($fd1,"$linia"."\n");
}
?>
problem w tym - jak go przerobić aby wyświetlał mi na ekran listę
wszystkich nazw plików z kodu img i nazw alternatywnych - czyli jak w dokumencie html
mam wpisy typu <img src=plik1.txt alt=test test> czy <img src="/var/www/testy/plik2.txt" alt=tetrtrtrtrt>
to żeby wyświetlił mi na ekran:
plik1.txt - test test
plik2.txt - tetrtrtrtrt
Niemam za bardzo pomysłu jak by to można było wykonać??
Był bym wdzięczny za jakąkolwiek pomoc.
Offline
sa skrypty parsujace kod html, ktore by Ci to ladnie wyjely bez wiekszego problemu, jednak nie wiem, czy w tym przypadku nie bylby to strzal z armaty do muchy
wiec jak juz masz wiersz ze znacznikiem '<img' to najlepiej go obetnij np. przy pomocy substr aby rozpoczynal sie od tego znacznika wlasnie (dlaczego o tym za chwile).
dalej by ten wiersz zamienil na tablice za pomoca explode, jako separator ustawiając spację
no i teraz przeszukac nasza tablice na ocecnosc 'src=' oraz 'alt=', masz np taki wynik:
wiersz[3] = 'src="/var/www/testy/plik2.txt"'
wiersz[6] = 'alt="tertrtrtrtrt"'
teraz wystarczy tylko usunac to co nam niepotrzebne np. przy pomocy str_replace
aha.. mialem wyjasnic dlaczego przycinac wiersz, aby sie rozpoczynal od '<img'. Ano dlatego, ze przed tym znacznikiem w danym wierszu moze wystapic inny znacznik, np.'<javascript>' ktory moze miec parametr 'src'.
Warto tez byloby pokusic sie o sprawdzenie, czy w dalszej czesci wiersza nie wystepuje kolejny znacznik '<img'
Ostatnio edytowany przez grzegorz.85 (2009-04-20 19:12:55)
Offline
<?php $str = 'sadfa /><img src="plik1.txt" alt="test test" /><adfa'; preg_match('/(?<img_tag><img.*\/>)/', $str, $match); $img_tag = $match['img_tag']; print $img_tag; preg_match_all('/(src|alt)=\"(?<attrib>\w+\.\w+\b)|([\w\s]+)\"/', $img_tag, $matches); print_r($matches); ?>
Trzeba trochę dopracować.
Offline
A ja bym się zastanowił nad celem takiej operacji, html nie jest odpowiednią technologią do przechowywania danych. No chyba, że to dla jednorazowego wygenerowania statycznego htmla. Jesli nie to lepiej stworzyć bazę danych i napisać skrypt, który do niej wrzuca te dane. Wiadomo sporo roboty, ale jasność rozwiązania zachowana, zdobyta dodatkowo wiedza bezcenna ;]
Offline
Czasem zachodzi konieczność parsowania stron. Nie wszystkie parsery xml radzą sobie z błędami, a wiele kodu html to nie xml, a do tego można znaleźć mnóstwo błędów w kodzie html. Wyrażenia regularne są najlepszym wyjściem w takim wypadku.
Offline
Nie no to jest zadanie które muszę wykonać! także chyba zostanie mi parsowanie! Chociaż:
Owca ma też ciekawy pomysł:
A ja bym potraktował kod html jako xml, pobrał wszystkie obiekty img do tablicy i w foreach-u wyświetlił pożądane argumenty.
Tylko nie bardzo siedziałem w xml'ach
Offline
W dokumentacji php jest praktycznie gotowe rozwiązanie, podane jak na tacy.
Offline
witam ponownie! Właściwie to sprawa wygląda tak - program muszę zrobić w c++ ale prosiłem o pomoc w php bo na podstawie php będe w stanie
prędzej to przenieść na c++ bo funkcje są podobne. Temat jest taki że muszę z pliku np plik.html wyciągnąć wszystkie nazwy plików
oraz nazwy alternatywne lub jeśli nie będzie nazwy alternatywnej to komunikat o jego braku. jest tyle prościej że nie muszę kożystac z żadnego parsera ponieważ mam wyciągnąć wszystko co będzie po < i m g s r c="
aż do zamknięcia cudzysłowia oraz po alt="
także do zamknięcia cudzysłowia ( czyli nie waże czy po src będzie odrazu nazwa pliku czy ścieżka do pliku:)
Nie bardzo wiem jak zrobić taki warunek który jeśli napotka I potem M potem G następnie S potem R potem C i = oraz " to żeby po " wypisał mi to na ekranie aż do zamknięcia cudzysłowia( a właściwie zrobił liste na ekranie nazw a obok nich nazw alternatywnych.
Był bym bardzo wdzięczny za jakiekolwiek info:)
Ostatnio edytowany przez debbie (2009-05-11 23:48:13)
Offline
IMHO niepotrzebnie chcesz wymyślać koło od nowa. Jest mnóstwo różnych parserów do html, xml, sgml oraz wyrażenia regularne. No ale skoro chcesz się bawić w pisanie parsera to polecam zacząć do przerobienia pierwszych trzech rozdziałów Ansii CK&R. Jak wykonasz wszystkie załączone ćwiczenia to już będziesz wiedział jak napisać parser. W zasadzie już po pierwszym rozdziale będziesz miał dobrą szkołę jak operować na tekście. :)
Offline
No spoko! ale przecież pisałem wyżej:
jest tyle prościej że nie muszę kożystac z żadnego parsera ponieważ mam wyciągnąć wszystko co będzie po < i m g s r c=" aż do zamknięcia cudzysłowia oraz po alt=" także do zamknięcia cudzysłowia ( czyli nie waże czy po src będzie odrazu nazwa pliku czy ścieżka do pliku:)
także wolałbym inaczej to obejść
Offline
Wypróbuj flexa i bisona. Myślę, że będą doskonałe.
http://www.sjp.pl/co/korzysta%C4%87
Ostatnio edytowany przez owca (2009-05-12 09:11:51)
Offline
Ale program ma być nie skomplikowany żeby uzywac jakiś narzędzi czy nakładek parsujących. Chodzi tylko o to aby po napotkaniu img src=" wyrzucał wszystko aż do zamkniecia cudysłowiai to samo po alt. Może ktoś chociaż wie jak to zrobić w php??
Offline
#/usr/bin/env python from re import compile from pprint import pprint plik = 'aaa.html' img = compile(r'<img (.*?)(/|)>') atrr = compile(r'(alt|src)="(.*?)"') f = open(plik, 'r') source = f.read() f.close() images_attrs = img.findall(source) attr_list = [atrr.findall(x[0]) for x in images_attrs] attr_dict = [dict(x) for x in attr_list] pprint(attr_dict)
A w php jest biblioteka tidy. W dokumentacji jest nawet przykład jak wyciągać obrazki (czyt. wyżej), ale zapewne nie przeglądałeś, bo po co?
Ostatnio edytowany przez czadman (2009-05-12 20:42:25)
Offline
Strony: 1