![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 183 Pomógł: 0 Dołączył: 19.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Mam pewną zagwostkę. Powiedzmy, że mam taki tekst:
Jakie wyrażenie zastosować, by zostawić tylko 1/2/3/4/X linki w tym tekście, a pozostałe zlikwidować i zostawić tylko tekst pomiędzy <a></a> ? Oczywiście przyjmując, że:
Czyli np dla "pseudofunkcji" zostaw_linki(2) efekt (dla tekstu powyżej) byłby:
Ten post edytował barat 8.12.2009, 10:11:14 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Jeśli nie bazujemy na żadnym ograniczaniu to owszem, callback może być użyty, ale do zwykłego usuwania tagu określonego - przerost formy nad treścią (IMG:style_emoticons/default/winksmiley.jpg) Sam preg_replace to potrafi. Zauważ jednak, że funkcja wywoływana jest za każdym znalezieniem elementu pasującego do wzorca. Musi więc siła rzeczy wiedzieć ile razy została już wywołana, a to bez jakiejś zmiennej statycznej czy globalnej jest nie do osiągnięcia, bo niby jak? Albo więc musi się odnosić do jakiejś statycznej, albo licznik wrzucasz jej jako parametr w argumentach. Oczywiście parametr musi być referencją, bo musisz go inkrementować wewnątrz funkcji i zwykłe wstawienie zmiennej nic nie da, bo utworzy ewentualnie kopię lokalną tej zmiennej, zapominaną po zakończeniu funkcji. Co będzie ostatecznie lepsze? Zależy od ilości i umiejscowienia linków w tekście. W obu ostatecznie jest używana_preg_replace (przypadek gdy osiągnięto tablicę LIMIT+1 elementową) albo wersja callbackowana i różnice nie powinny być ogromne. IMHO jednak dla ilości linków do LIMIT-1 szybsze będzie explode, if, implode niż preg_match_callback. Od LIMIT powinno być to zbliżone.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
...Zauważ jednak, że funkcja wywoływana jest za każdym znalezieniem elementu pasującego do wzorca. Musi więc siła rzeczy wiedzieć ile razy została już wywołana, a to bez jakiejś zmiennej statycznej czy globalnej jest nie do osiągnięcia, bo niby jak? Albo więc musi się odnosić do jakiejś statycznej, albo licznik wrzucasz jej jako parametr w argumentach. Oczywiście parametr musi być referencją, bo musisz go inkrementować wewnątrz funkcji i zwykłe wstawienie zmiennej nic nie da, bo utworzy ewentualnie kopię lokalną tej zmiennej, zapominaną po zakończeniu funkcji... przyznaj się szczerze, że nie czytałeś tego co pisałem ;p - zmienne globalne (IMG:style_emoticons/default/questionmark.gif) , zmienne statyczne (IMG:style_emoticons/default/questionmark.gif) parametr w argumentach (IMG:style_emoticons/default/questionmark.gif) - tfu tfu - nie po to specjalnie jakby nie mógł doczytać do linków podawałem link do callback i przykład użycia obiektu normalnego - tzn nie statycznego ;p Sam preg_replace to potrafi... sam str_replace to potrafi - wyrażenia regularne (IMG:style_emoticons/default/questionmark.gif) - czyż nie przerost formy nad treścią (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/tongue.gif) - wszystko zależy od logiki aplikacji... ....W obu ostatecznie jest używana_preg_replace (przypadek gdy osiągnięto tablicę LIMIT+1 elementową) albo wersja callbackowana i różnice nie powinny być ogromne. IMHO jednak dla ilości linków do LIMIT-1 szybsze będzie explode, if, implode niż preg_match_callback. Od LIMIT powinno być to zbliżone. po primo to pisałem o funkcji preg_replace_callback a nie o preg_match_callback ;P , poza tym akurat czym mniejszy limit tym więcej do zamieniania ;P - i raczej rzekłbym , że jest odwrotnie (aczkolwiek nigdzie nie pisałem, że tak będzie najszybciej - tak będzie najwygodniej) - skoro tak piszesz to sądzę, że zrobiłeś jakieś testy (IMG:style_emoticons/default/questionmark.gif) (IMG:style_emoticons/default/haha.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 4.10.2025 - 07:08 |