Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] preg_replace
lopez86
post
Post #1





Grupa: Zarejestrowani
Postów: 187
Pomógł: 0
Dołączył: 24.12.2006

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


chcę aby preg_replace zamienił to co znajdzie na to co zwróci funkcja

  1. <?php
  2. $content=preg_replace("@<a href="[^#]([^"]*)"[^><]*>@si", tourl(1) ,$content);
  3. ?>


funkcja "tourl()" zamiast dostawać wartości trafione dostaje "\\1" , a mi chodzi o to że ma dostać to co pasuje następnie funkcja to przerabia i pregmatch zamienia na to co zwróciła funkcja.

Nie działa ...


--------------------
c++ , javascript , PHP , SQL , MYSQL , CSS - wszystko czego potrzebuje prawdziwy mężczyzna LoL
Go to the top of the page
+Quote Post
siemakuba
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Po pierwsze, musisz dodać modifier e, aby skorzystać z możliwości wykonania funkcji od razu na znalezionych danych. Zamiast @si dajesz więc @esi.

Po drugie, błędnie zapisałeś odwołanie do funkcji. Poprawnie winno to być tak:
  1. <?php
  2. preg_replace("@<a href="[^#]([^"]*)"[^><]*>@esi", "tourl($1)" ,$content);
  3. ?>


pozdr.
Go to the top of the page
+Quote Post
lopez86
post
Post #3





Grupa: Zarejestrowani
Postów: 187
Pomógł: 0
Dołączył: 24.12.2006

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


Dzięki - mam odrazu pytanko gdzie można poczytać oprócz książek na temat modyfikatorów bo tego naprawdę nie umie znaleźć nigdzie, jest dużo o wyrażeniach regularnych ale o modyfikatorach nic nie znalazłem konkretnego.


--------------------
c++ , javascript , PHP , SQL , MYSQL , CSS - wszystko czego potrzebuje prawdziwy mężczyzna LoL
Go to the top of the page
+Quote Post
siemakuba
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Najlepiej chyba w manualu zacząć - http://pl.php.net/manual/pl/reference.pcre...n.modifiers.php

A potem szukać w googlu na hasło PCRE Pattern Modifiers i rozszerzać wiedzę. Nie pamiętam, żebym czytał jakieś opracowanie dotyczące tylko i wyłącznie modyfikatorów. Poza tym, tak naprawdę nie mają aż takiej "mocy", żeby jakoś się o nich rozpisywać wielce winksmiley.jpg

pozdr.
Go to the top of the page
+Quote Post
lopez86
post
Post #5





Grupa: Zarejestrowani
Postów: 187
Pomógł: 0
Dołączył: 24.12.2006

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


Nie będę zaczynać nowego tematu bo mam kolejne pytanie co do wyrażeń regularnych (wiedzę poszerzyłem o modyfikatory) ale teraz mam inne pytanie.

Jak np. wyszukaj string zaczynający się od <table> i zakończ na </table>.

Bo co na przykład jeżeli mam kilka tabel i wtedy bardzo trudno jest znaleźć coś pomiędzy <table> a </table> aby nie wystąpiło dalej. Czyli czy istnieje jakiś znacznik czy coś podobnego co powie procesorowi że od <table> do pierwszego wystąpienia </table> i to będzie wzór.

i jeszcze jedno : jak w wyrażeniu napisać że pomiędzy np. <table> a </table> nie może wystąpić konkretny ciąb znaków a nie pojedyńczy czyli np. aby wybrać te które nie mają pomiędzy <table> a </table> znaku "*" to piszę wyrażenie
  1. <?php
  2. "@<table>[^*]*</table@si"
  3. ?>
ale co jeśli chcę aby pomiędzy <table> i </table> nie wystąpił ciąg znaków "<a href" wtedy to nie zadziała z tego co zauważyłem to bierze pod uwagę każdą literę/znak z podanego ciągu a nie jako całość
  1. <?php
  2. "@<table>[^<a href]*</table>@si
  3. ?>


To drugie pytanie jest ważniejsze bo bez tego pierwszego sobie jakoś poradzę ale bez tego drugiego nic nie zdziałam.

Ten post edytował lopez86 18.04.2007, 16:48:52


--------------------
c++ , javascript , PHP , SQL , MYSQL , CSS - wszystko czego potrzebuje prawdziwy mężczyzna LoL
Go to the top of the page
+Quote Post
Kicok
post
Post #6





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


W nawiasach kwadratowych podaje się klasę znaków do wyszukiwania, więc wyrażenie [^<a href] nie oznacza:
- dopasuj wszystkie znaki aż do napotkania "<a href"
tylko:
- dopasuj wszystkie znaki, które nie są: "<", "a", " ", "h", "r", "e", "f"


A co do pierwszego problemu, to wyrażenia regularne są domyślnie 'zachłanne', czyli będą się starały dopasować jak najwięcej znaków tylko się da, ale żeby pasowało do wzorca. Używając znaku pytajnika możemy zamienić wyrażenie na 'niezachłanne', czyli starające się dopasować jak najmniej znaków tylko się da, ale żeby pasowało do wzorca. Tak więc wyrażenie: <table>(.*)</table> dopasuje:
Cytat
asfsa
<table>
asdasd</table>
dsfds
<table> saf saf </table>
safsa
<table>
sad sa
asfdsad
</table>
asdsad


natomiast wyrażenie: <table>(.*?)</table> dopasuje:
Cytat
asfsa
<table>
asdasd</table>
dsfds
<table> saf saf </table>
safsa
<table>
sad sa
asfdsad
</table>
asdsad


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
lopez86
post
Post #7





Grupa: Zarejestrowani
Postów: 187
Pomógł: 0
Dołączył: 24.12.2006

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


Dzięki za pomoc szczególnie dla Kicok bo tego nie umiałem znaleźć nigdzie i pewnie nigdy bym na to nie wpadł ... smile.gif


--------------------
c++ , javascript , PHP , SQL , MYSQL , CSS - wszystko czego potrzebuje prawdziwy mężczyzna LoL
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 Aktualny czas: 19.08.2025 - 04:52