Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wyrażenie regularne - preg_match
Forum PHP.pl > Forum > Przedszkole
kuba_pilach
Witam!
Przedstawię swój problem. Słaby jestem w wyrażeniach regularnych.
Mam taki tekst, który jest jedynie cząstka całej treści zmiennej $zawartosc:
Kod
<span class="postbody"><span style="font-weight: bold">1.     Forum</span>
<br />
1.1.     Nie spamuj.
<br />
1.2.     Nie OFF-TOP’uj.
<br />
1.3.     Zakaz pisania nie na temat.
<br />
1.4.     Nie nabijaj postów.
<br />
1.4.1.    Posty mające poniżej 3 słów, będą  uznawane za nabijanie rangi i karane punktami, oraz kasowane.
<br />
1.5.     Do założenia nowego tematu, należy wybrać odpowiedni dział.
<br />
1.6.     Każdy post powinien być napisany zgodnie z zasadami poprawnej pisowni polskiej, tj. poprawny ortograficznie, gramatycznie i interpunkcyjnie.
<br />
1.7.     Zakaz używania wyrazów wulgarnych.
<br />
1.8.    Zakaz używania obraźliwych wyrazów, oraz obrażania innych forumowiczów.
<br />
1.9.    Zakaz pisania samymi WERSALIKAMI (z włączonym Caps Lockiem).
<br />
1.10.    Zakaz pisania w TaKi SpOsÓb.
<br />
1.11.    Zabronione jest namawianie do piractwa, czyli podawanie linków do stron warezowych, torrentów i innych tego typu.
<br />
1.12.    Zakaz umieszczania nieprzyzwoitych (pornograficznych) lub promujących przemoc treści, lub linków do nich.
<br />
1.13.    Każdy Forumowicz, może mieć tylko jedno konto.
<br />
1.14.    Kolory <span style="color: darkred">ciemno-czerwony</span>, <span style="color: red">czerwony</span> i <span style="color: blue">niebieski  </span>zarezerwowane są dla adminów, natomiast kolor <span style="color: green">zielony </span>dla modów. [Osoby mające inną rangę specjalną piszą takim samym kolorem jak wszyscy zwykli użytkownicy.]
<br />
1.15.    W niektórych pod-forach znajdują się osobne regulaminy.
<br />
1.16.    Zakaz denerwowania zarządu forum.
<br />
1.17.    W podpisie można mieć tylko jeden link. Nie wolno umieszczać w podpisie obrazków większych, niż 300x300 pxl - podpis nie powinien rozciągać forum.
<br />
1.18.    Awatar może mieć do 150 pikseli szerokości, wysokość nie większą niż 180 pikseli, a rozmiar nie większy niż 54kB.
<br />
1.19.    Przepis o nieaktywnych kontach znajduje się <a href="http://www.forumzwiadowcy.fora.pl/o-forum,69/nieaktywni-uzytkownicy,158.html" target="_blank" class="postlink">tutaj</a>.
<br />
1.20. Zakaz spoilerowania (spiolery należy kolorować na biało i oznaczać <span style="color: orange">pomarańczowym </span>napisem <span style="color: orange">SPOILER</span>)
<br />
1.21 Każdy użytkownik, który nie napisał jeszcze 25 postów może zostać zgłoszony do Zarządu forum jako potencjalny <span style="font-style: italic">troll</span>. Każdy wniosek zostanie rozpatrzony.
<br />

<br />
<span style="font-weight: bold">2.    C-BOX</span>
<br />
2.1.    Zakaz masowego pisania postów w C-Boxach (spamowania).
<br />
2.2.    Należy starać się pisać pełne zdania, zaczynać je z dużej litery i kończyć kropką.
<br />
2.3.    Zakaz podszywania się pod innych użytkowników w Chat-Boxie.
<br />
2.4.    Należy wpisywać identyczną nazwę użytkownika jak ta, jaką ma się na forum.
<br />
2.5.    Nie wolno podawać linków do innych forów oraz do stron wymienionych w 1.11.
<br />
2.6.    Należy się stosować również do punktów od 1.1 do 1.16 oraz do punktu 1.20.
<br />
2.7    Zakaz reklamowania opowiadań z Celtii.
<br />

<br />
<span style="font-weight: bold">3.     Moderatorzy</span>
<br />
3.1.    Nie zmieniajcie treści postów napisanych przez adminów.
<br />
3.2.    Nie kasujcie postów napisanych przez adminów.
<br />
3.3.    Nie dawajcie ostrzeżeń bez potrzeby.
<br />
3.4.    Osoba mająca choć jedno ostrzeżenie nie może pełnić funkcji moderatora.
<br />

<br />
<span style="font-weight: bold">4.    Ostrzeżenia: skala.</span>
<br />
4.1.     Za złamanie 1.1 –  10 ostrzeżeń.
<br />
4.2.     Za złamanie 1.2 –  od 5 do 10 ostrzeżeń.
<br />
4.3.     Za złamanie 1.3 – od 5 do 10 ostrzeżeń.
<br />
4.4.     Za złamanie 1.4 – od 10 do 30 ostrzeżeń.
<br />
4.5.     Za złamanie 1.5 – 2 ostrzeżenia.
<br />
4.6.     Za złamanie 1.6 – [od 1 do 10 ostrzeżeń.
<br />
4.7.     Za złamanie 1.7 – 20 ostrzeżeń.
<br />
4.8.     Za złamanie 1.8 – od 10 do 20 ostrzeżeń.
<br />
4.9.     Za złamanie 1.9 – 3 ostrzeżenia.
<br />
4.10.    Za złamanie 1.10 – 5 ostrzeżeń.
<br />
4.11.    Za złamanie 1.11 – od 20 do 30 ostrzeżeń.
<br />
4.12.    Za złamanie 1.12 – <span style="font-style: italic">40 ostrzeżeń</span>.
<br />
4.13.    Za złamanie 1.13 – 10 ostrzeżeń+ usunięcie drugiego konta.
<br />
4.14.    Za złamanie 1.14 – 5 ostrzeżeń.
<br />
4.15.    Za złamanie 1.15 – od 3 do 10 ostrzeżeń.
<br />
4.16.    Za złamanie 1.16 – 10 ostrzeżeń.
<br />
4.17.    Za złamanie 1.17 – 10 ostrzeżeń+ wieczysta blokada podpisu i miesięczna avka.
<br />
4.18.    Za złamanie 1.18 – 10 ostrzeżeń+ wieczysta blokada awatara.
<br />
4.19.    Za złamanie 1.19 – usunięcie konta.
<br />
4.19.1. Uznanie, że użytkownik jest trollem - usunięcie konta.
<br />
4.20.    Za złamanie 2.1 –  10 ostrzeżeń + <span style="font-style: italic">ban z C-boxa</span>.
<br />
4.21.    Za złamanie 2.2 – od 1 do 3 ostrzeżeń.
<br />
4.22.    Za złamanie 2.3 – od 10 do 20 ostrzeżeń.
<br />
4.23.    Za złamanie 2.4 – od 5 do 10 ostrzeżeń.
<br />
4.24.    Za złamanie 2.5 – 20 ostrzeżeń.
<br />
4.25.    Za złamanie 2.6 – kara przewidziana za złamanie odpowiedniego punktu Regulaminu.
<br />
4.26. Za złamanie 1.20 - od 5 do 10 ostrzeżeń.
<br />
4.27. Za złamanie 2.7 - 10 ostrzeżeń.
<br />
4.27.    40 ostrzeżeń = <span style="font-weight: bold">Ban</span>.
<br />

<br />
<span style="font-weight: bold"><span style="text-decoration: underline">Zastrzegamy możliwość zmiany regulaminu.</span></span></span>
                    <span class="gensmall">

I potrzebuję wyciągnąć takie coś. Znaleźć wytropić. Jedyne co z tego się nie zmienia to początek:
Kod
<span class="postbody">

I koniec:
Kod
<span class="gensmall">


Pomógłby ktoś z ułożeniem wyrażenia regularnego? Do preg_matcha potrzebny. a próbowałem wszelkich i no wiecie, g z tego wyszło ...
abort
U mnie zadziałało:
  1. echo preg_replace ('/\"postbody\"(.*)<span class=\"gensmall\">/m', '\\1', $zawartosc);
kuba_pilach
U mnie nie.
Wyświetla całą $zawartosc... A ma tylko to co dałem wyżej...
Tzn nic przed początkiem i nic po końcu.
abort
Sorry, pomyłka.
  1. echo preg_replace ('|(.*)"postbody">(.*)<span class="gensmall">(.*)|ms', '$2', $zawartosc);
kuba_pilach
No niestety to nie to... Wyświetliło zupełnie nie to co miało... A dziwne, bo postbody jest tylko jedno i to co podałem. Więc, to co podałeś, nie jest rozwiązaniem.
Ma ktoś jeszcze jakieś pomysły bądź rozwiązania?
abort
Dziwne, bo u mnie działa: http://test.abort.it.pl/regexp.php
Źródło możesz podejrzeć pod http://test.abort.it.pl/regexp.phps (phps!)
kuba_pilach
http://wklej.org/id/806784/
Wprowadź proszę powyższą zawartość do $zawartosc i teraz zobacz, czy ci działa
abort
W powyższej zawartości ciąg znaków
Kod
<span class="gensmall">

występuje... 7 razy. Więc nic dziwnego, że mój regexp nie zadziałał. Zbyt wiele z dokumentu pasowało (rozpoznawał początek, ale koniec już mu się pomylił!)

W takim przypadku regexpa trzeba nieco zmienić, żeby nie był "zachłanny"
  1. $after = preg_replace ('|(.*)"postbody">(.*?)<span class="gensmall">(.*)|ms', '$2', $zawartosc);


Odwiedź sobie jeszcze raz adresy podane przeze mnie wyżej. Dla pliku php nie zdziw się, bo wczyta stronę i ją wyświetli, ale po zaznaczeniu całego tekstu w dokumencie zobaczysz wynik jak na dłoni smile.gif
kuba_pilach
Dzięki!
Ale mam jeszcze jeden problem:
  1. while($after = preg_replace ('|(.*)"postbody">(.*?)<span class="gensmall">(.*)|ms', '$2', $tresctematu2)){
  2. echo '<br/><br/>'.$post3.'<br/><br/>';
  3. echo '<br/><br/>'.$after.'<br/><br/>';
  4.  
  5. $tresctematu = str_replace($after,'',$tresctematu);
  6. }


Co robię źle w powyższym?
Chodzi mi o to, że teraz się zapętla i cały czas bierze to samo. A chcę, by usuwał i jak może znaleźć inny pasujący do wzoru, to niech znajduje, a jak nie, niech przestaje...

EDIT:::
Okej, literówka. Zauwazyłem biggrin.gif

EDITX2::
A nie... Teraz tylko jedno zostawia... A ma wyświetlać wszystkie spełniające regexpa...
abort
W źródle srony jest JEDNO wystąpienie <span class="postbody">. Regułka jest napisana tak, by dopasować napis od tego miejsca do początku wystapienia najbliższego <span class="gensmall">, i zwraca napis POMIĘDZY tymi tekstami (nie dołączając tych tekstów). Taki napis jest JEDEN, bo jest jeden <span class="postbody">. W związku z tym wynikiem jest ciąg znaków zaczynający się za tagiem <span class="postbody">, i kończący się tuż przed tagiem <span class="gensmall">.

Co do Twojego kodu: w pętli while sprawdzasz CIĄGLE TEN SAM WARUNEK - tam jest zmienna $tresctematu2 (widzisz te "2" na końcu zmiennej?). I ta zmienna wewnątrz while() nie jest modyfikowana, więc co się dziwisz? Wpuściłeś kompa w pętlę nieskończoną, to liczy... i liczy... i liczy... dopóki nie przerwiesz.
kuba_pilach
http://wklej.org/id/806911/
Tu jest inny przypadek.
Są dwa postbody. Zmieniłem
Kod
    $tresctematu = str_replace($after,'',$tresctematu);

na
Kod
    $tresctematu2 = str_replace($after,'',$tresctematu2);

Wyświetla mi tylko jedno spełniające warunek. A ma tyle, ile znajdzie.
abort
Nie trzeba było tak od razu? Tu bardziej przyda się preg_match:

Kod
$ilosc = preg_match ('/"postbody">(.*?)<span class="gensmall">/ms', $zawartosc, $wystapienia);

w $zawartość podajesz źródło strony, na wyjściu dostajesz uzupełnioną tablicę $wystapienia i ostatni indeks tablicy w zmiennej $ilosc.
Po ostatnim przykładzie zmienna $ilosc wyniesie 1, ale trzeba pamiętać, że po preg_match indeks tablicy "leci" od zera. Czyli mamy dwa wystąpienia. Finito.
kuba_pilach
Dzięki ci ponownie biggrin.gif
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.