Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Masowa zamiana fragmentów tekstu, brak wydajności
Forum PHP.pl > Forum > Przedszkole
mch.frnc
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!
Noidea
  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
mch.frnc
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!
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.