Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziwne zachowanie funkcji ereg_replace.
-Guest-
post 7.05.2006, 11:32:32
Post #1





Goście







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")
Go to the top of the page
+Quote Post
matrach
post 7.05.2006, 11:40:35
Post #2





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

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


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. ?>
Go to the top of the page
+Quote Post
-Guest-
post 7.05.2006, 12:21:51
Post #3





Goście







Niestety nic to nie dalo sad.gif
Go to the top of the page
+Quote Post
matrach
post 7.05.2006, 12:25:33
Post #4





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

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


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
Go to the top of the page
+Quote Post
mariuszn3
post 7.05.2006, 13:01:11
Post #5





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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
{\*(.+?)\*}
Go to the top of the page
+Quote Post
matrach
post 7.05.2006, 13:24:05
Post #6





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

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


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 to the top of the page
+Quote Post
mariuszn3
post 8.05.2006, 13:39:43
Post #7





Grupa: Zarejestrowani
Postów: 352
Pomógł: 0
Dołączył: 22.01.2006

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


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).
Go to the top of the page
+Quote Post
matrach
post 8.05.2006, 18:22:24
Post #8





Grupa: Zarejestrowani
Postów: 92
Pomógł: 0
Dołączył: 17.04.2006

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


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
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 5.07.2025 - 04:06