Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwne zachowanie funkcji ereg_replace.
Forum PHP.pl > Forum > Przedszkole
Guest
Dlaczego poniższy kod działa tak jak działa?

plik z szablonem strony
Kod
to sie pokaze
{* asdgfhgf  hfgh h assdadasd *}
to sie nie pokaze
{* asdash gfh  fghgfh dadasd *}
i to tez sie pokaze


parser php5
  1. <?php
  2.  
  3. $szablon = ereg_replace('{\*(.+)\*}', '', $szablon);
  4. echo $szablon
  5.  
  6. ?>


Wynik?

Kod
to sie pokaze
i to tez sie pokaze


Dlaczego nie pokazuje mi sie tekst miedzy dwoma komentarzami? ("to sie nie pokaze")
matrach
To jest spowodowane przez zachłanność erega.
Jeśli dasz (.+) to wyszukuje jak najdłuższe wystąpienie, czyli czeka do ostatniego '}'
Zrób tak:
  1. <?php
  2. preg_replace('({\*(.+)\*})', '', $szablon);
  3. ?>
Guest
Niestety nic to nie dalo sad.gif
matrach
Jak nie działa jak działa:
To:
  1. <?php
  2. $szablon = "to sie pokaze
  3. {* asdgfhgf hfgh h assdadasd *}
  4. to sie nie pokaze
  5. {* asdash gfh fghgfh dadasd *}
  6. i to tez sie pokaze";
  7. echo preg_replace('({\*(.+)\*})', '', $szablon);
  8. ?>

Zwraca:
Kod
to sie pokaze to sie nie pokaze i to tez sie pokaze
mariuszn3
Matrach przecież dodanie nawiasów nie wpłynie na to co cały reg obejmuje... (?)
Trzeba faktycznie zmienić zachłannnosć, ale dostawiając znak zapytania (wtedy przestawia się tryb dopasowania z 'chciwie' na 'leniwie' - to tak w wolnym tłumaczeniu ('greedy', 'lazy')).
Kod
{\*(.+?)\*}
matrach
Cytat(mariuszn3 @ 2006-05-07 14:01:11)
Matrach przecież dodanie nawiasów nie wpłynie na to co cały reg obejmuje... (?)

Gdybyś zauważył to dałem preg_replace, a nie ereg_replace
A te nawiasy to takie ograniczniki sobie dałem (?)
Równie dobrze może być:
  1. <?php
  2. preg_replace('/{\*(.+)\*}/', '', $szablon);
  3. ?>

A twoje wyrażenie jest niepoprawne. Testowałeś je?
mariuszn3
Cytat(matrach @ 2006-05-07 12:24:05)
Cytat(mariuszn3 @ 2006-05-07 14:01:11)
Matrach przecież dodanie nawiasów nie wpłynie na to co cały reg obejmuje... (?)

Gdybyś zauważył to dałem preg_replace, a nie ereg_replace
A te nawiasy to takie ograniczniki sobie dałem (?)
Równie dobrze może być:
  1. <?php
  2. preg_replace('/{\*(.+)\*}/', '', $szablon);
  3. ?>

A twoje wyrażenie jest niepoprawne. Testowałeś je?

Gość odwoływał się do funkcji ereg_replace(), w której nie stosuje się żadnych ograniczników.
Twój przykład faktycznie odwołuje się do preg_replace (co przeoczyłem).. nie mniej po odjęciu ograniczników Twój regex zupełnie niczym się różni od tego, który gościowi sprawia problem.
Mój przykład działa jak najbardziej prawidłowo, testowałem (choć jest na tyle prosty, że naprawdę można obejść się bez testowania).
matrach
Cytat(mariuszn3 @ 2006-05-08 14:39:43)
nie mniej po odjęciu ograniczników Twój regex zupełnie niczym się różni od tego, który gościowi sprawia problem.

1) Po odjęciu ograniczników sktypt działa, choć wyrażenie jest takie samo, ale działa inaczej. Zostawia '{' i '}' gdyż uznaje je za ograniczniki.
2) Od tego są ograniczniki żeby je dawać w preg'u, a nie je stamtąd usuwać. (Wiem że to mądrze sformułowałem tongue.gif )
3) Jak gościu sie odwoływał do ereg_replace to ja nie mogę do preg_replace questionmark.gif
4)Ten twój regex mi zwraca bład, choć możliwe że mam jakąś inną wersje biblioteki.(albo coś)
5)Gościu już dawno rozwiązał problem
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.