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

/**
 * 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="#">&raquo;</a>').$nl;
echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", false,  ' <a href="#">&raquo;</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="#">&raquo;</a><br />
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