Szöveg első N szavának kinyerése reguláris kifejezéssel, php-val

A következő függvény az első N darab szót tudja kinyerni egy szövegből. Figyelembe veszi, hogy bár vessző, pont, stb... után szóköz kell, ezt nem mindenki tartja be. Ha egy mondat záródik az N. szó után, akkor a mondatzáró jelet is meghagyja. Egyébként levágja. Az N. szó után, ha az eredmény nem az egész szöveget tartalmazza, tetszőleges karakterlánc kiírható. Alapértelmezetten a három pont. Be lehet kapcsolni, hogy unicode karaktereket is tartalmaz-e a szöveg, vagy sem. Alapértelmezetten true-ra van állítva.

Függvény

  1. /**
  2.  * Szövegből első N szó kinyerése
  3.  *
  4.  * @param int $n Hány szó kell a szöveg elejéről
  5.  * @param string $str A forrás szöveg
  6.  * @param bool $unicode Unicode karakterek lehetnek-e a szövegben.
  7.  * @param string $more Az eredmény szöveg mögé írt karakterlánc, ha az eredmény nem a teljes szöveg.  
  8.  * @return string
  9.  */
  10. function firstNWord($n, $str, $unicode = true, $more = ' ...') {
  11.         $php53 = version_compare(PHP_VERSION, '5.3') >= 0;
  12.         $w = $php53 ? '\w' : ($unicode ? '\p{L}\p{N}' : '\w');
  13.         $W = $php53 ? '\W' :  '^'.$w;
  14.        
  15.         return preg_replace('~^(\s*['.$w.']+'.
  16.                         str_repeat('['.$W.']+['.$w.']+', $n-1).
  17.                         '(?(?=[?!:;.])
  18.                                 [[:punct:]]\s*
  19.                         ))\b(.+)$~isx'.($unicode ? 'u' : ''), '$1'.$more, $str);
  20. }

A függvény elején levő verzió ellenőrzés azért kellett, mert 5.3 -ban már a \w is illeszkedik ékezetes karakterre.

Példák

  1. $nl = '<br />'.PHP_EOL;
  2. echo firstNWord(5, "Ez egy").$nl;
  3. echo firstNWord(5, "Ez egy.").$nl;
  4. echo firstNWord(4, "Ez egy szöveg.Amiből megtartok 4 szót.").$nl;
  5. echo firstNWord(3, "Ez egy szöveg. Amiből megtartok 3 szót.").$nl;
  6. echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", true,  ' <a href="#">&raquo;</a>').$nl;
  7. echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", false,  ' <a href="#">&raquo;</a>').$nl;

Eredmény

  1. Ez egy<br />
  2. Ez egy.<br />
  3. Ez egy szöveg.Amiből ...<br />
  4. Ez egy szöveg.  ...<br />
  5. Ez egy szöveg,amiből megtartok <a href="#">&raquo;</a><br />
  6. Ez egy szöveg,amib <a href="#">&raquo;</a><br />

Bár a fenti példákra működik a megoldás, nem kizárt, hogy nem tökéletes.

Kategóriák: 
Megosztás/Mentés

Új hozzászólás