Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Masowa zamiana fragmentów tekstu, brak wydajności
mch.frnc
post 13.09.2011, 12:28:59
Post #1





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 15.08.2008

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


Witam,
mam taki oto problem. Mam tekst, w którym występuje mniej więcej coś takiego:

  1. tekst-{$różny_znak}, tekst-{$różny_znak}...
itd.
Moim celem jest uzyskanie takiego efektu, że gdy identyczne $różny_znak występujące obok siebie (czyli np.: "tekst-A, tekst-A") zamieniane jest to na: "tekst-AA". Przy czym gdy ponownie spotykane jest "tekst-A" oraz "tekst-AA" również jest to zamieniane na "tekst-AAA" itd. (chodzi o dodawanie, takie zbijanie w jedno występujących obok siebie).

Próbowałem wykorzystać do tego pętlę while i str_replace, jednak jest to bardzo niewydajne i czasy wykonywania skryptu są okropne... Jednak nie mam innego pomysłu na to. Czy ktoś ma jakąś ideę, jak to sprawnie i wydajnie rozwiązać?

Z góry dzięki, pozdrawiam!

Ten post edytował mch.frnc 13.09.2011, 12:30:55
Go to the top of the page
+Quote Post
Noidea
post 13.09.2011, 13:25:00
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


  1. <?php
  2.  
  3. $text = "tekst-A, tekst-B, tekst-A, tekst-A, tekst-C, tekst-A, tekst-A, tekst-A, tekst-D";
  4.  
  5. echo preg_replace_callback( "~tekst-(.)(, tekst-\\1)+~", function( $match ) {
  6. $count = substr_count( $match[0], "tekst-" );
  7. return "tekst-" . str_repeat( $match[1], $count );
  8. }, $text );
  9.  
  10. ?>


Jeśli masz PHP starsze niż 5.3, użyj zwykłej funkcji zamiast anonimowej (patrz przyklady na: preg_replace_callback)
Jeśli chcesz zrozumieć jak to działa poczytaj o wyrażeniach regularnych ze szczególnym naciskiem na tzw. back references

Ten post edytował Noidea 13.09.2011, 13:26:46


--------------------
Go to the top of the page
+Quote Post
mch.frnc
post 13.09.2011, 13:37:26
Post #3





Grupa: Zarejestrowani
Postów: 73
Pomógł: 4
Dołączył: 15.08.2008

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


Bardzo Ci dziękuję, tym bardziej, że nie spodziewałem się gotowego rozwiązania:))

Tymczasem pojawił się kolejny problem, aczkolwiek trochę podobny:
zamiana
  1. "tekst-$A-$zmienna, tekst-$A-$inna_zmienna" na: "tekst-$A-$zmienna$inna_zmienna"

Ale myślę, że po lekkiej modyfikacji Twojego kodu uda mi się to osiągnąć wink.gif

Wielkie dzięki za pomoc raz jeszcze!
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: 24.07.2025 - 17:17