Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PCRE] preg_match_all - Fraza w przeczeniu
starach
post
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Witam.
Chciałbym wykorzystać w przeczeniu (^), nie pojedynczy znak tylko frazę.
  1. <?php
  2. $source = 'tak asdfafasf tak saafdafaf tak';
  3. $pattern = '#tak([^tak]*)tak#';
  4. preg_match_all($pattern, $source, $matches);
  5. var_dump($matches);
  6. ?>
Tak jak jest powyżej nie działa. Jak napiszę [^(tak)]* też nie działa.
Więc jak to zrobić ?

Ten post edytował orglee 9.01.2008, 15:37:58
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zimi
post
Post #2





Grupa: Zarejestrowani
Postów: 233
Pomógł: 9
Dołączył: 3.06.2007

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


Kod
(?>[^<]*)

"znaczy połknij wszystkie znaki różne od < i nie oddawaj" (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
przetestuj:
  1. <?
  2. echo preg_match("@(?>a+)ab@","aaab");
  3. echo preg_match("@(?>a+)b@","aaab");
  4. echo preg_match("@a+ab@","aaab");
  5. ?>

podobną właściwość... to jest w sumie chyba równoważne... a jak nie jest to nie wiem czym się różni będzie miało
  1. <?
  2. echo preg_match("@(?>a++)ab@","aaab");
  3. ?>

regexp jak znajdzie "a+" we wzorcu to najpierw łyka wszystkie "a" które spotka, ale jak się okaże że zaraz po "a+" jest potrzebne "a", to jedno "a" "wypluje" z powrotem, aby można było resztę wzorca dopasować
a++ jak i (?>a+) czy analogiczne konstrukcje nie pozwalają "wypluwać"
mam nadzieje że dość jasno to opisałem.. starałem się...
co do (?R) to jest to rekurencyjne zagnieżdżenie, teoretycznie to wygląda tak że cały zewnętrzny wzorzec (jeśli się nie mylę) powinien zostać wpisany w miejsce (?R)
czyli jeśli twój wzorzec ma postać (to jedynie postać schematyczna... nie ma prawa działać...):
Kod
foo(?R)bar
no to to się rekurencyjnie zagłębia w siebie
Kod
foofoofoofoo(?R)barbarbarbar
itp.
w dokumentacji wyrażeń regularnych jest to dość słabo opisane i może dlatego nie udało mi się napisać regexp-a rekurencyjnego który by działał tak jak bym tego chciał... (trochę to pogięte... albo ja jestem głupi (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) )
co do "wykorzystania w przeczeniu całej frazy" to tutaj używamy asercji negatywnych "patrzących do przodu"
  1. <?php
  2. echo preg_match("@^(?!Jestem głupi).+$@","Jestem głupi");
  3. ?>

mimo że pozwalam pojawić się wszystkim znakom => .+
To i tak nie dam sobie wmówić że jestem głupi (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) :P
generalnie polecam przeczytać dokumentację regexp (w sumie 16 stron) dość dobrze napisana (tylko ta rekurencja jakoś średnio...)
najgorsze jest że wszystko jest podobne a mamy wyrażenia warunkowe, 4 rodzaje asercji, rekurencje, różne operacje na podciągach ciężko zapamiętać jak to się oznacza wszystko (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
co do x masz rację... tutaj autor rozdzielał wszystko spacjami dla łatwiejszego czytania tych wszystkich nawiasów...
jak wywalisz spacje to możesz również wywalić x

PS. jak odkryjesz zasadę działania rekurencji we wzorcu to możesz to opisać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) będę wdzięczny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

EDIT: męczyłem, męczyłem i wymęczyłem, to działa chyba jak kod który podałeś
  1. <?php
  2. $str = "<div>bbdiv>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>";
  3. preg_match_all("@<div>(?(?=</?div>)(?R)|.)+</div>@",$str, $match);
  4. var_dump($match);
  5. $out2 = ob_get_contents();
  6. echo'<pre>';
  7. ?>


Ten post edytował zimi 10.01.2008, 01:23:16
Go to the top of the page
+Quote Post

Posty w temacie


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: 11.10.2025 - 03:05