Szöveg első N karakterének kinyerése reguláris kifejezéssel, php-val
Beküldte Rimelek - 2011, október 2 - 12:09Az előző bejegyzésemhez hasonló megoldást mutatok, csak most nem adott számú szót vág le a függvény egy szövegből, hanem karaktereket. Szintén állítható, hogy mi kerüljön a levágott szöveg végére, ha volt mit vágni. És szintén megadható, hogy unicode szövegként legyen-e értelmezve a megadott string. Itt mégis a lényegesebb paramétere a függvénynek a 3. paraméter. Ha egy szövegben pont egy szót kéne ketté vágni, nem biztos, hogy jól mutat. Vegyük példának azt a szöveget, hogy: „Mi ez a foszfor?”. Ennek az első 11 karakterét levágva fixen elég érdekes eredményt kapnánk, ami nem biztos, hogy megengedhető. A következő függvény harmadik paraméterével szabályozható, hogy a szövegben a félbevágott szavakat be kell-e fejezni, vagy esetleg el sem kell kezdeni. Netán nyugodtan meg lehet vágni bárhol. A megoldás most is reguláris kifejezésekkel működik, bár az mb_substr függvényt is használhattam volna.
Függvény
* Szöveg első N karakterének kinyerése
*
* @param int $n Hány karakter kell
* @param string $str A string, amiből az első N karakter kell.
* @param bool $wordwrapmod Ha null, akkor szavak közben is megvághatja szöveget.
* Ha true, akkor befejezi a szót, aminek a közepén vágna.
* Ha false, akkor el sem kezdi a szót, aminek a közepén vágna.
* @param bool $unicode Unicode karaktereket is értelmezzen.
* @param string $more Tetszőleges szöveg, jelölés, ami akkor kerül az eredmény mögé,
* ha vágni kellett belőle.
* @return string A levágott első N karakter
*/
function firstNChar($n, $str, $wordwrapmod = null, $unicode = true, $more = ' ...')
{
$php53 = version_compare(PHP_VERSION, '5.3') >= 0;
$w = $php53 ? '\w' : ($unicode ? '\p{L}\p{N}' : '\w');
$W = $php53 ? '\W' : '^'.$w;
$x = $b = '';
if ($wordwrapmod) {
$x = '(?(?=['.$w.']+)['.$w.']+)';
} else if (!is_null($wordwrapmod)) {
$b = '(?=['.$W.']+)';
}
return preg_replace('~^(?>(.{0,'.(int)$n.'})'.$b.$x.').+$~is'.($unicode ? 'u' : ''), '$1'.$more, $str);
}
Példák
echo firstNChar(10, "Ez egy szöveg").$nl;
echo firstNChar(10, "Ez egy szöveg", false).$nl;
echo firstNChar(10, "Ez egy szöveg", true).$nl;
echo firstNChar(10, "Ez egy szöveg", null, false).$nl;
echo firstNChar(10, "Ez egy szöveg", null, true, ' <a href="">»</a>').$nl;
Eredmény
Ez egy ...<br />
Ez egy szöveg<br />
Ez egy sz� ...<br />
Ez egy szö <a href="">»</a><br />