Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> usuwanie powtarzania znaków, regexp
czachor
post 30.05.2007, 17:32:31
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. $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


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Balon
post 30.05.2007, 17:35:36
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 smile.gif bo . jest traktowana nie jako kropka tylko "wszystko".

Ten post edytował Balon 30.05.2007, 17:36:15


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
czachor
post 30.05.2007, 17:41:06
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? smile.gif

Poza tym wydaje mi się, że kropka w [ ] nie jest traktowana jako "wszystko"...


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
Balon
post 30.05.2007, 17:57:01
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. $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.


--------------------
Postura wielka i morda wredna, jestem Balon, kozak z osiedla !
bzdury.pl - Królestwo rozrywki
Go to the top of the page
+Quote Post
czachor
post 30.05.2007, 18:03:21
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...


--------------------
how many SEO experts does it take to change a light bulb,lightbulb,light,bulb,lamp,lighting,switch,sex,xxx
5-Reasons-why-you-should-NEVER-fix-a-computer-for-free
Go to the top of the page
+Quote Post
Kicok
post 31.05.2007, 16:00:20
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ć 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".

Ten post edytował Kicok 31.05.2007, 16:18:35


--------------------
"Sumienie mam czyste, bo nieużywane."
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: 28.06.2025 - 08:28