Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][Regexp] Zostaw tylko (X) linków w tekscie
barat
post
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:

  1. Lorem ipsum dolor sit <a href="#">amet</a>, consectetur adipiscing elit. Proin <a href="#">amet</a> elementum odio eget mauris ultricies vulputate. Suspendisse scelerisque vulputate risus ac lobortis. <a href="#">Aenean</a> euismod urna at libero vehicula non sollicitudin elit luctus. Aliquam ultricies nisi ac sapien tempus imperdiet sit amet ut nulla. Proin aliquam blandit libero eu ornare. Suspendisse a erat ligula. Phasellus ultricies odio nec metus dictum eget luctus augue interdum. Morbi at turpis libero, imperdiet iaculis sapien. In sed sapien eget turpis semper imperdiet. <a href="#">Nulla</a> iaculis blandit lorem, eget laoreet mauris euismod sed. Vivamus hendrerit euismod tellus, in adipiscing lectus eleifend in. <a href="#">Aliquam</a> imperdiet placerat orci ac ultrices. Curabitur eu sem tortor, at dapibus dolor.


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:
  • Zostawiamy linki "od lewej" czyli 1/2/3/4/X pierwszych
  • Nigdy nie wiem ile linków zostało wpisanych
  • Linki nie koniecznie muszą być różne (np. 2 wystąpienia <a href="#">amet</a> + kilka innych linków. Mogą być także obok siebie)
  • Linki mogą mieć dodatkowe atrybuty np: <a href="#" target="_blank" title="title" onclick="" class="" id="">aaa</a>


Czyli np dla "pseudofunkcji" zostaw_linki(2) efekt (dla tekstu powyżej) byłby:

  1. Lorem ipsum dolor sit <a href="#">amet</a>, consectetur adipiscing elit. Proin <a href="#">amet</a> elementum odio eget mauris ultricies vulputate. Suspendisse scelerisque vulputate risus ac lobortis. Aenean euismod urna at libero vehicula non sollicitudin elit luctus. Aliquam ultricies nisi ac sapien tempus imperdiet sit amet ut nulla. Proin aliquam blandit libero eu ornare. Suspendisse a erat ligula. Phasellus ultricies odio nec metus dictum eget luctus augue interdum. Morbi at turpis libero, imperdiet iaculis sapien. In sed sapien eget turpis semper imperdiet. Nulla iaculis blandit lorem, eget laoreet mauris euismod sed. Vivamus hendrerit euismod tellus, in adipiscing lectus eleifend in. Aliquam imperdiet placerat orci ac ultrices. Curabitur eu sem tortor, at dapibus dolor.


Ten post edytował barat 8.12.2009, 10:11:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
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.
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(thek @ 8.12.2009, 13:25:16 ) *
...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
Cytat(thek @ 8.12.2009, 13:25:16 ) *
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...
Cytat(thek @ 8.12.2009, 13:25:16 ) *
....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)
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 4.10.2025 - 07:08