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%)
-----


tzn. Twoja forma tłumaczenia do mnie nie dociera (nie mniej wydaję mi się że bardzo źle zinterpretowałeś), ogólne założenie że rekurencja działa od środka jest mylne
jak wywołujesz rekurencje w swoich programach to masz coś a'la
  1. <?
  2. function foo()
  3. {
  4. //jakiś kod
  5. if(...)
  6. {
  7.  //jakiś kod
  8.  foo();
  9.  //jakiś kod
  10. }
  11. //jakiś kod
  12. }
  13. ?>

więc działa od zewnątrz wgłąb(sic!) a nie od środka na zewnątrz
jak nie miałeś doczynienia z rekurencją to zobacz na wikipedii... => odrób lekcje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
czyli analizując moją regexp:
Kod
@<div>(?(?=</?div>)(?R)|.)+</div>@

@<div> - wiadomo...
(?(?=</?div>)(?R)|.) dla uproszczenia => (?(a)b|c)
w takiej postaci to znaczy jeśli a to dopasuj b w przeciwnym wypadku c
a => (?=</?div>)
b => (?R)
c => .
w wyrażeniu sprawdzającym chyba najczęściej używa sie asercji
Cytat
Kolejna część ma się równać </?div> natomiast w tym znak zapytania sprawdza czy zostało dopasowane </ i jeśli tak każe kontynuować

chciałbym szczególną uwagę zwrócić na słowo dopasowane... w regexp kojarzy się ono z tym że jak to uroczo jest w dokumentacji opisane regexp "skonsumował" jakiś ciąg
tutaj jednak mamy doczynienia z asercją, asercja sprawdza co jest w odpowiednim miejscu (zależnie od tego jakiej asercji użyjemy) jednak jej nie konsumuję...
prosty przykład
  1. <?php
  2. preg_match("@^(?=a)b$@", "ab");
  3. ?>

zwróci false bo asercja nie dopasuję "a", a jedynie sprawdzi czy "a" znajduję się w żądanym przez asercje miejscu

rekurencje już opisałem... może niezbyt wyraźnie...
Cytat
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)

a zatem jeśli w regexp znajdzie się (?R) to parser (czy interpreter... nie wiem jak się przyjęło to nazywać) będzie dopasowywał od początku wyrażenie regularne...
może przykład
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

wyrażenie dopasuje <div> tak jak to stwierdziliśmy i ponieważ dalej od miejsca w którym zaczyna nie widzi <div> lub </div> dopasowuję w kółko jeden jakikolwiek znak...
gdy zobaczy <div> to ten fragment jest jakby odcinany i dopasowuję do niego od nowa całego regexp-a
więc wycina sobie pogrubiony fragment:
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

i niejako sam w sobie robi:
  1. <?
  2. preg_match("@<div>(?(?=</?div>)(?R)|.)+</div>@","<div>bbbb</div>");
  3. ?>

tutaj bez problemu przechodzi po kolejnych "b" dopasowując po jednej literce
a dalej napotyka problem bo mimo że ma dopasować jakąkolwiek literkę to nie może tego zrobić gdy ta literka zaczyna ciąg: </div>
więc "+" zakończył swoje działanie i dopasowywany jest </div> z końcówki wyrażenia
po czym wyskakuje z niego na wyższy poziom i dopasowuję reszte która mu została z całości:
Cytat
<div>bb<div>bbbb</div><div>b<div>bbbb</div>bbb</div>bb</div>

mam nadzieję że dość jasno wytłumaczyłem...

zakończyłem swój wykład o regexp (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) może kiedyś napiszę kurs bo jest słabo opisany w sumie
jednak polecam przyswoić dokumentacje do której jest link w manualu PHP

Ten post edytował zimi 10.01.2008, 18:20:23
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 - 10:43