Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] preg_replace
Forum PHP.pl > Forum > Przedszkole
lopez86
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 ...
siemakuba
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.
lopez86
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.
siemakuba
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.
lopez86
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.
Kicok
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
lopez86
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
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.