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
/**
* Szövegből első N szó kinyerése
*
* @param int $n Hány szó kell a szöveg elejéről
* @param string $str A forrás szöveg
* @param bool $unicode Unicode karakterek lehetnek-e a szövegben.
* @param string $more Az eredmény szöveg mögé írt karakterlánc, ha az eredmény nem a teljes szöveg.
* @return string
*/
function firstNWord($n, $str, $unicode = true, $more = ' ...') {
$php53 = version_compare(PHP_VERSION, '5.3') >= 0;
$w = $php53 ? '\w' : ($unicode ? '\p{L}\p{N}' : '\w');
$W = $php53 ? '\W' : '^'.$w;
return preg_replace('~^(\s*['.$w.']+'.
str_repeat('['.$W.']+['.$w.']+', $n-1).
'(?(?=[?!:;.])
[[:punct:]]\s*
))\b(.+)$~isx'.($unicode ? 'u' : ''), '$1'.$more, $str);
}
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
$nl = '<br />'.PHP_EOL;
echo firstNWord(5, "Ez egy").$nl;
echo firstNWord(5, "Ez egy.").$nl;
echo firstNWord(4, "Ez egy szöveg.Amiből megtartok 4 szót.").$nl;
echo firstNWord(3, "Ez egy szöveg. Amiből megtartok 3 szót.").$nl;
echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", true, ' <a href="#">»</a>').$nl;
echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", false, ' <a href="#">»</a>').$nl;
Eredmény
Ez egy<br />
Ez egy.<br />
Ez egy szöveg.Amiből ...<br />
Ez egy szöveg. ...<br />
Ez egy szöveg,amiből megtartok <a href="#">»</a><br />
Ez egy szöveg,amib <a href="#">»</a><br />
Bár a fenti példákra működik a megoldás, nem kizárt, hogy nem tökéletes.