Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> wyszukiwanie wyrazów krótszych niż n znaków
czachor
post
Post #1





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

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


Witam,
niestety nie jestem za mocny w wyrażeniach regularnych no i mam wydaje się banalny problem. Próbuję znaleźć w ciągu wyrazy krótsze niż 4 znaki i usunąć je z ciągu... Próbuję tego:
  1. <?php
  2. $str = 'abc defg hi j kllmno prs';
  3. print_r(preg_replace('/ w{1,3} /', ' ', $str)); //zwraca: abc defg j kllmno prs
  4. ?>

Coś jest nie tak... Jakby ktoś coś podpowiedział, będę wdzięczny!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Grzyw
post
Post #2





Grupa: Zarejestrowani
Postów: 561
Pomógł: 75
Dołączył: 19.08.2004
Skąd: Wrocław

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


A ja bym ominął regularne:
  1. <?php
  2. $str = 'abc defg hi j kllmno prs';
  3. $tablica = explode(' ',$str);
  4. foreach ($tablica as $key => $element)
  5. {
  6. if (strlen($element)>3) $tablicaNew[]=$element;
  7. }
  8.  
  9. $strNew = impolode(' ',$tablicaNew);
  10. ?>
Go to the top of the page
+Quote Post
nevt
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


to działa:
$str = 'abc defg hi j kllmno prs';
echo "1. ($str)<br />";
$str = preg_replace('/^|\s/', ' \_0 ', $str); ('backslash zero spacja'- wywalić podkreślenie)
$str = preg_replace('/(\s)(\S){1,3}(\s)/', '', $str);
$str = preg_replace('/(^|\s)\s/', '\1', $str);
echo "2. ($str)";

Edit1: poprawka dla powtarzających się sekwencji (dlatego zostawało j...)
Edit2: zmiana znaczników z php na code
Edit3: zmiana nie pomogła - w ogóle wywalam znaczniki...
Edit4: zmiana nie pomogła dalej nie wyświetla sekwencji \_0 (backslash zero - wywalić podkreślenie)
Edit5: Ten edytor jest do dupy, to już któryś raz kiedy nie pozwala mi przedstawić poprawnego składniowo kodu PHP...

Ten post edytował nospor 1.02.2008, 08:39:44
Go to the top of the page
+Quote Post
czachor
post
Post #4





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

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


Hm jednak jeszcze nie do końca... Zobacz, że zostaje "j"... usuwa spację sprzed niego, ale zostawia... A zobacz, co się dzieje, jak będzie tam jeszcze jeden znak pojedynczy: $str = 'abc defg hi j kllmno X prs'; Zwróci: 'defgj kllmnoprs' :/

--edit
O, ekstra, dzięki. Działa jak trzeba, zaraz dokładnie sobie przeanalizuję całość.
@Grzyw - wiem, że można to explodem potraktować, ale od tego są właśnie wyrażenia regularne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

--edit2
Hm, prawie działa... nie wycina znaków na końcu ciągu... :/
Go to the top of the page
+Quote Post
Tubis
post
Post #5





Grupa: Zarejestrowani
Postów: 44
Pomógł: 2
Dołączył: 27.03.2007
Skąd: Sufczyn

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


Tak bo z tego co widzę to to wyrażenie zamienia znaki kończące się jakimkolwiek odstępem. Także jeśli po znakach nie będzie spacji, tabulatora lub entera to nie zadziała
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


to już chyba ostatnia korekta, podmień czwartą linjkę na:
  1. <?php
  2. ...
  3. $str = preg_replace('/(s)(S){1,3}(s|$)/', '', $str);
  4. ...
  5. ?>
Go to the top of the page
+Quote Post
czachor
post
Post #7





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

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


W tej chwili zostawia tylko spacje na początku i na końcu, ale to narazie sobie potraktuję trim()-em, a potem dorzucę to do regexpa. Dzięki wielkie!
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: 23.08.2025 - 16:53