Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: usuwanie powtarzania znaków
Forum PHP.pl > Forum > PHP
czachor
Witam, mam takie coś...
  1. <?php
  2. $no = '!?.,';
  3. $maxChars = 4;
  4. $str='ciąg znaków!!!!! aaaaaaaaaa questionmark.gifquestionmark.gif?.......';
  5.  
  6. $pattern = '/[' . $no . ']{' . $maxChars . ',}/ei';
  7. var_dump(preg_replace($pattern, "substr('0', 0, " . $maxChars . ")", $str));
  8. ?>


Wykonanie tego kodu zwróci:
Kod
ciąg znaków!!!! aaaaaaaaaa questionmark.gifquestionmark.gif


Zasadniczo jest ok, bo usuwa powtórzenia wybranych znaków, gdy jest ich więcej niż 4, z tym że ten regexp traktuje np. "?questionmark.gifquestionmark.gif......." jako jeden element i skraca do "?questionmark.gif?" (a nie osobno znaki zapytania i kropki).

Chcę osiągnąć, żeby skrypt usuwał mi powtórzenia każdego wymienionego znaku osobno, czyli w tym przykładzie na końcu powinno być "?questionmark.gif?....". Nie potrafię odpowiednio skonstruować wyrażenia...

Będę wdzięczny za pomoc smile.gif
Balon
  1. <?php
  2. $no = '!?.,';
  3. ?>

Tak mi się wydaje smile.gif bo . jest traktowana nie jako kropka tylko "wszystko".
czachor
eee... a czym Twoje $no różni się od mojego? smile.gif

Poza tym wydaje mi się, że kropka w [ ] nie jest traktowana jako "wszystko"...
Balon
Tak teraz testuje to wydaje mi się, że sensownym wyjściem by było


  1. <?php
  2. $no = array(
  3. '!', '?', '.', ','
  4. );
  5.  
  6. $maxChars = 4;
  7. $ret = 'ciąg znaków!!!!!questionmark.gif? aaaaaaaaaa?questionmark.gifquestionmark.gif.......';
  8.  
  9. foreach( $no as $n ){
  10. $ret = preg_replace( '/[' . $n . ']{' . $maxChars . ',}/ei', "substr('0', 0, " . $maxChars . ")", $ret );
  11. }
  12.  
  13. var_dump($ret);
  14. ?>


Bo próbuje teraz ułożyć regexpa do tego i mi coś nie chce wyjść. Bo masz racje, że jak nastąpią po sobie jakieś znaki z regexpa to cały fragment jest skracany.
czachor
No jest to wyjście, ale chyba nie do końca optymalne...
Kicok
w klasie znaków [...] tylko daszek, myślnik, slash i nawiasy kwadratowe mają specjalne znaczenie i trzeba umieścić przed nimi znak ucieczki. Czyli przykład z pierwszego posta powinien działać dry.gif


Ja proponuję coś takiego:
  1. <?php
  2.  
  3. $ret = 'ciąg znaków!!!!!questionmark.gif? aaaaaaaaaa?questionmark.gifquestionmark.gif.......';
  4.  
  5.  
  6. $no = '!?.,';
  7. $maxChars = 4;
  8.  
  9. $no = str_replace( array('^', '', '-', '[', ']'), array('^', '', '-', '[', ']'), $no );
  10.  
  11.  
  12. $ret = preg_replace( '/([' . $no . '])(1{0,' . ($maxChars-1) . '})(?:1)*/i', '12', $ret );
  13. echo( $ret );
  14.  
  15. ?>



[EDIT]
Już widzę co jest źle. Umieściłeś "niechciane" znaki w klasie, więc twoje wyrażenie brzmiało: "jeśli znajdziesz co najmniej 4 pod rząd obojętnie jakie znaki należące do podanej klasy znaków, to je skróć".
A chciałeś, żeby brzmiało "jeśli znajdziesz co najmniej 4 wykrzykniki pod rząd, lub co najmniej 4 pytajniki pod rząd, lub co najmniej ..., to je skróć."

Przeanalizuj sobie moje wyrażenie. Dodam tylko, że \\1 w wyrażeniu to odwołanie wsteczne. Czyli wstawiane tam jest to, co zostało "znalezione w pierwszym nawiasie okrągłym".
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.