Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [regexp] Jak określić?
Forum PHP.pl > Forum > PHP
Blackhole
Hej!
Chciałbym z tekstu wyciągnąć wszystkie wyrazy długości od 2 do 3 znaków. Mam aktualnie tak:
  1. <?
  2. preg_match_all("#\s([0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]{2,3})\s#Usi", $txt, $sh);
  3. ?>
Jednak nie wyciąga to wyrazów, które są na początku lub końcu tekstu. I tu mam problem, bo nie wiem, jak to zdefiniować blinksmiley.gif
Pomóżcie...
Fifi209
  1. <?php
  2.  
  3. $s = 'to jest jakis tek st as sdfs sdf się';
  4.  
  5. $reg = '#([^\s]{2,3})#';
  6.  
  7. preg_match_all($reg, $s, $matches);
  8.  
  9. echo '<pre>';
  10. print_r($matches);
  11.  
  12. ?>


Może tak? haha.gif
Blackhole
Wątpię blinksmiley.gif
[^\s] definiuje przecież znak nie będący białym znakiem, a nie "początek ciągu lub biały znak" worriedsmiley.gif
Blackhole
Pr0100, spróbowałem więc tak:
  1. function x2words_($txt, $dl) {
  2. echo "<b>com:</b> ".$txt."<br />";
  3. // zwraca ciag ze zdwojonymi slowami dlugosci d: 1<d<=$dl
  4. preg_match_all("#[\s\A]([0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]{2,".$dl."})[\s\Z]#Usi", $txt, $sh); // wyciagnij krotkie wyrazy
  5. echo '<pre>'; print_r($sh); echo '</pre>';
  6. $sh = $sh[1];
  7. for ($si=0; $si<count($sh); $si++) // zdubluj znalezione krótkie wyrazy
  8. $sh[$si] .= $sh[$si];
  9. $out = implode(" ", $sh); // zrób z nich string
  10. echo "<b>out:</b> ".$out;
  11. return $out;
  12. }
  13. $txt = 'To je string nie tak mały i do testów - tfu';
  14. echo $str."<br />".x2words_($str,3);
i otrzymuję:
Cytat
com: To je string nie tak mały i do testów - tfu

Array
(
[0] => Array
(
[0] => je
[1] => nie
[2] => ały
[3] => do
)

[1] => Array
(
[0] => je
[1] => nie
[2] => ły
[3] => do
)

)

out: jeje nienie łyły dodo
To je string nie tak mały i do testów - tfu
jeje nienie łyły dodo

Spróbowałem też dać \b zamiast tych \A i \Z, ale wynik jest taki:
Cytat
com: To je string nie tak mały i do testów - tfu

Array
(
[0] => Array
(
[0] => je
[1] => nie
[2] => do
)

[1] => Array
(
[0] => je
[1] => nie
[2] => do
)

)

out: jeje nienie dodo
To je string nie tak mały i do testów - tfu
jeje nienie dodo

Czyli nie działa sad.gif
Fifi209
Cytat(Blackhole @ 14.06.2010, 23:07:27 ) *
Wątpię blinksmiley.gif
[^\s] definiuje przecież znak nie będący białym znakiem, a nie "początek ciągu lub biały znak" worriedsmiley.gif


To nie rozumiem...może opisz dokładnie

Początek ^ koniec $ wystarczy poczytać...
http://pl.php.net/manual/pl/regexp.reference.circudollar.php
Blackhole
fifi209, dałem:
  1. preg_match_all("#(\s|^)([0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]{2,".$dl."})(\s|$)#Usi", $txt, $sh); // wyciagnij krotkie wyrazy
  2. echo '<pre>'; print_r($sh); echo '</pre>';
  3. $sh = $sh[2];
i zadziałało smile.gif
Mam jeszcze problem, jeśli krótkie słowa występują koło siebie, bo wtedy "wyciągane" są tylko nieparzyste, gdyż końcowy biały znak "zabrany" w matchowaniu nieparzystego wyrazu nie jest już odnajdywany w parzystym, który jest tuż za nim. Rozumiem, dlaczego się tak dzieje, ale nie wiem, jak temu przeciwdziałać worriedsmiley.gif

Już wiem winksmiley.jpg
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.