Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wyszukiwanie wyrazów krótszych niż n znaków
Forum PHP.pl > Forum > PHP
czachor
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!
Grzyw
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. ?>
nevt
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...
czachor
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 smile.gif

--edit2
Hm, prawie działa... nie wycina znaków na końcu ciągu... :/
Tubis
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
nevt
to już chyba ostatnia korekta, podmień czwartą linjkę na:
  1. <?php
  2. ...
  3. $str = preg_replace('/(s)(S){1,3}(s|$)/', '', $str);
  4. ...
  5. ?>
czachor
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!
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.