Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> usuwanie powtarzania znaków, regexp
czachor
post
Post #1





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


Witam, mam takie coś...
  1. <?php
  2. $no = '!?.,';
  3. $maxChars = 4;
  4.  
  5. $pattern = '/[' . $no . ']{' . $maxChars . ',}/ei';
  6. var_dump(preg_replace($pattern, "substr('0', 0, " . $maxChars . ")", $str));
  7. ?>


Wykonanie tego kodu zwróci:
Kod


Zasadniczo jest ok, bo usuwa powtórzenia wybranych znaków, gdy jest ich więcej niż 4, z tym że ten regexp traktuje np. "?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ......." jako jeden element i skraca do "?(IMG:http://forum.php.pl/style_emoticons/default/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ć "?(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?....". Nie potrafię odpowiednio skonstruować wyrażenia...

Będę wdzięczny za pomoc (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Balon
post
Post #2





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

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


  1. <?php
  2. $no = '!?.,';
  3. ?>

Tak mi się wydaje (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) bo . jest traktowana nie jako kropka tylko "wszystko".

Ten post edytował Balon 30.05.2007, 17:36:15
Go to the top of the page
+Quote Post
czachor
post
Post #3





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


eee... a czym Twoje $no różni się od mojego? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Poza tym wydaje mi się, że kropka w [ ] nie jest traktowana jako "wszystko"...
Go to the top of the page
+Quote Post
Balon
post
Post #4





Grupa: Zarejestrowani
Postów: 422
Pomógł: 0
Dołączył: 14.12.2005
Skąd: Wałbrzych

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


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.  
  8. foreach( $no as $n ){
  9. $ret = preg_replace( '/[' . $n . ']{' . $maxChars . ',}/ei', "substr('0', 0, " . $maxChars . ")", $ret );
  10. }
  11.  
  12. var_dump($ret);
  13. ?>


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.
Go to the top of the page
+Quote Post
czachor
post
Post #5





Grupa: Zarejestrowani
Postów: 897
Pomógł: 40
Dołączył: 16.12.2003
Skąd: Warszawa

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


No jest to wyjście, ale chyba nie do końca optymalne...
Go to the top of the page
+Quote Post
Kicok
post
Post #6





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


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ć (IMG:http://forum.php.pl/style_emoticons/default/dry.gif)


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



[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".

Ten post edytował Kicok 31.05.2007, 16:18:35
Go to the top of the page
+Quote Post

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: 28.09.2025 - 13:46