Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][PHP]wycinanie kawałków tekstu
segat
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 26.03.2009

Ostrzeżenie: (0%)
-----


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ć (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 11)
melkorm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  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 (IMG:style_emoticons/default/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>


Ten post edytował melkorm 2.01.2010, 20:50:30
Go to the top of the page
+Quote Post
segat
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 26.03.2009

Ostrzeżenie: (0%)
-----


Qrcze no dzięki melkorm (IMG:style_emoticons/default/smile.gif)
Właśnie sie dowiedziałem jaki jestem cienki z regularnych (IMG:style_emoticons/default/smile.gif)
Co prawda jeszcze nie wiem co do czego ale już szukam po manualu (IMG:style_emoticons/default/smile.gif)
Ważne że działa.

Dzięki raz jeszcze.
Pozdrawiam.
Go to the top of the page
+Quote Post
Pawel_W
post
Post #4





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


http://pl.wikibooks.org/wiki/PHP/Podstawy_...%84_regularnych

polecam (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
melkorm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 .... (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)
4. .*\s.*\s\[([0-9]+)\]\[(.*)\] - (to dla mnie jest brzydkie, ale działa (IMG:style_emoticons/default/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 \].
Go to the top of the page
+Quote Post
Pawel_W
post
Post #6





Grupa: Zarejestrowani
Postów: 1 675
Pomógł: 286
Dołączył: 15.06.2009
Skąd: Wieliczka

Ostrzeżenie: (0%)
-----


Cytat(melkorm @ 2.01.2010, 21:54:21 ) *
1. Każdy pattern musi być w // .

wcale nie (IMG:style_emoticons/default/winksmiley.jpg) // to flagi i można je zmieniać, równie dobrze pattern może być w ## (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
segat
post
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 26.03.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
melkorm
post
Post #8





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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


Wiki

Ten post edytował melkorm 4.01.2010, 01:39:21
Go to the top of the page
+Quote Post
segat
post
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 26.03.2009

Ostrzeżenie: (0%)
-----


Witam.
Dzięki melkorm.
Pozwól że jeszcze jedno(osatnie) pytanie (IMG:style_emoticons/default/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.


Go to the top of the page
+Quote Post
melkorm
post
Post #10





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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


Spróbuj tak.

Jeszcze wieczorkiem luknę jak coś (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
segat
post
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 26.03.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)

Ten post edytował segat 6.01.2010, 17:55:09
Go to the top of the page
+Quote Post
melkorm
post
Post #12





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


  1. preg_match_all('#<a class="kasa_powtarzalna".*</a>(.*)\[.*\]\[.*\]#s',$t,$matches);
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 03:52