Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]wycinanie kawałków tekstu
Forum PHP.pl > Forum > Przedszkole
segat
Witam.
Z góry przepraszam jeśli już było, szukałem ale nie znalazłem.
Pytanie jest takie:
Jest jakiś tam tekst html, w tym tekście html jest np. 10 linków porozrzucanych po całej stronie. Przykładowo:

<a class="kasa_powtarzalna" http://www.example1.pl>tytuł strony</a>
Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Znaki specjalne <html></html><i>" (*)(@# LKJ LHF(*U)(* ILKFHKLDHFIU H@!)_)#* OIH LCogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum<jakieś adresy>lkjsdl;fkj sdlkfj</php>
[0800102102][wielki książe]

<a class="kasa_powtarzalna" http://www.example2.pl>tytuł strony2</a>
Sumo corgito ego Sumo corgito ego Sumo corgito ego LKJ LHF(*U)(* ILKFHKLDHFIU H@!)_)#* OIH LCogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum<jakieś adresy>lkjsdl;fkj sdlkfj</php>
[090338890][mała książka]


Wiem że beznadziejny przykład ale najprościej tak to wytłumaczyć smile.gif
Mianowicie - jak widać, powtarza się tylko tekst <a class="klasa_powtarzalna" http://
Później już nic się nie powtarza aż do kolejnego <a class itd. Pomiędzy tymi powtarzalnymi częściami, są różne znaki html(tak jak na przykładzie).

Teraz tak - chciałbym móc sobie zapisać(np. w tablicy, BD, obojętne) adres witryny, oraz to co pisze w nawiasach kwadratowych na samym dole w danym przedziale, do powtórzenia kolejnego "<a class=..."(w pierwszym przykładzie "0800102102" i "wielki książe"").

Na początku starałem się to zrobić funkcją
preg_match_all='/(<a class="klasa_powtarzalna">)+(http:\/\/)+(([a-zA-Z0-9])*\.){2,5}\.?\/?[a-zA-Z0-9]*<\/a>+/si' -> no ale to mi wyświetla tylko adres http. Kombinowałem z pętlami, a później z kolejnym preg_match ale nic z tego

Wymyśliłem żeby powycinać kawałki tekstu, czyli np. od <a class="klasa_powtarzalna do <a class="klasa_powtarzalna" (było by tego np. 10 kawałków tekstu) i dopiero te kawałki tekstu poddać "czesaniu" przez preg'a.

Prosiłbym o jakieś porady, nakierowanie jak to zrobić, cokolwiek. Czy jest możliwość w ogóle wycinania kawałków tekstu, jeśli jakaś część jest niezmienna i powtarza się np. 10 razy ? Chodzi mi o wycięcie od początku danego kawałka tekstu który się powtórzy, do jego powtórzenia i tak w kółko, aż sobie wszystko podziele na części(zapiszę do tablicy te 10 kawałków tekstu po ileś tam znaków).

Pozdrawiam.
Darek
melkorm
  1. $t = '<a class="kasa_powtarzalna" href="http://www.example1.pl">tytuł strony</a>
  2. Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum Znaki specjalne <html></html><i>" (*)(@# LKJ LHF(*U)(* ILKFHKLDHFIU H@!)_)#* OIH LCogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum<jakieś adresy>lkjsdl;fkj sdlkfj</php>
  3. [0800102102][wielki książe]
  4.  
  5. <a class="kasa_powtarzalna" href="http://www.example2.pl">tytuł strony2</a>
  6. Sumo corgito ego Sumo corgito ego Sumo corgito ego LKJ LHF(*U)(* ILKFHKLDHFIU H@!)_)#* OIH LCogito ergo sum Cogito ergo sum Cogito ergo sum Cogito ergo sum<jakieś adresy>lkjsdl;fkj sdlkfj</php>
  7. [090338890][mała książka]';
  8.  
  9. $matches = array();
  10. preg_match_all('/<a class="kasa_powtarzalna" href="(.*)">.*\s.*\s\[([0-9]+)\]\[(.*)\]/',$t,$matches);
  11. array_shift($matches);
  12. var_dump($matches);


... a może tak snitch.gif

P.S. Założyłem że w :
  1. <a class="kasa_powtarzalna" http:\/\/www.example2.pl>tytuł strony2</a>

(eh, parser sam przerabia adresy w kodzie >.>")

miało być:
  1. <a class="kasa_powtarzalna" href="http://www.example2.pl">tytuł strony2</a>
segat
Qrcze no dzięki melkorm smile.gif
Właśnie sie dowiedziałem jaki jestem cienki z regularnych smile.gif
Co prawda jeszcze nie wiem co do czego ale już szukam po manualu smile.gif
Ważne że działa.

Dzięki raz jeszcze.
Pozdrawiam.
melkorm
Sam nie jestem zn ich dobry, ale to co napisałem mogę Tobie jeszcze opisać, jeżeli ktoś potrafi napisać lepsze to bardzo proszę bo naprawdę nie wiem czy to w ogóle ma coś wspólnego z wyrażeniami regularnymi .... sad.gif
  1. preg_match_all('/<a class="kasa_powtarzalna" href="(.*)">.*\s.*\s\[([0-9]+)\]\[(.*)\]/',$t,$matches);


1. Każdy pattern musi być w // .
2. Nawiasy dają nam to że zostanie to uwzględnione w wynikach.
3. href="(.*)" -> czyli tutaj adres url winksmiley.jpg
4. .*\s.*\s\[([0-9]+)\]\[(.*)\] - (to dla mnie jest brzydkie, ale działa tongue.gif)
.* = cokolwiek i ilekolwiek, \s - łamanie linii i znów cokolwiek i ilekolwiek (jesteśmy w linii z "[090338890][mała książka]") \[ zaznaczenie że to nie część pattern'u tyko zwykły znak.
([0-9]+) (uwzględnienie w wynikach) - znaki od 0-9 w ilości jeden lub więcej. i znów zwykły znak \] po nim \[, znów uwzględnienie wszystkiego co znajdzie się w nawiasach kwadratowych czyli (.*) i zamknięcie nawiasu kwadratowego \].
Pawel_W
Cytat(melkorm @ 2.01.2010, 21:54:21 ) *
1. Każdy pattern musi być w // .

wcale nie winksmiley.jpg // to flagi i można je zmieniać, równie dobrze pattern może być w ## winksmiley.jpg
segat
Mam jeszcze małe pytanko.
Jak to jest z tym " \s " -> bo w kursach pisze, że jest to symbol spacji a nie znak nowej linii(jak w pokazanym tutaj przykładzie) ?

Pozdrawiam.
melkorm
Cytat
\s - biały znak (np. spacja, tabulator)


Wiki
segat
Witam.
Dzięki melkorm.
Pozwól że jeszcze jedno(osatnie) pytanie smile.gif
W jaki sposób wycinać kawałki tekstu: np. od <a class="kasa_powtarzalna" do [mała książka]'
Chcę mieć wszystko, co jest zawarte między nimi, ale warunek jest taki że nie wiem ile dokładnie to będzie miało linii(czyli enterów). Nie działa mi z separatorem /si na końcu wyrażenia preg_match, jeśli tam ileś tam \s w linii wyr. regularnego, to działa - tylko że czasami jest to 5 linii tekstu, a czasami np. 10.

Pozdrawiam i dzięki raz jeszcze za odpowiedzi.


melkorm
  1. preg_match_all('/<a class="kasa_powtarzalna" href="(.*)">.*\[([0-9]+)\]\[(.*)\]/ims',$t,$matches);


Spróbuj tak.

Jeszcze wieczorkiem luknę jak coś winksmiley.jpg
segat
hmm nie do końca o to mi chodziło - chodzi o to żeby wyświetlić WSZYSTKO POMIEDZY ' /< klasa powtarzalna /> ' a '[ cokolwiek w nawiasie ]'Zakładamy, że klasa powtarzalna i nawiasy kwadratowe sie powtarzaja. Z tym że pomiedzy nimi jest raz 5 linijek(enterów) a raz np 10. Mam nadzieje że mnie zrozumiałeś wiem że niejasno tłumacze ale staram sie jak moge smile.gif
melkorm
  1. preg_match_all('#<a class="kasa_powtarzalna".*</a>(.*)\[.*\]\[.*\]#s',$t,$matches);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.