függvény

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

Az 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

$nl = '<br />'.PHP_EOL;
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="">&raquo;</a>').$nl;

Eredmény

Ez egy szö ...<br />
Ez egy ...<br />
Ez egy szöveg<br />
Ez egy sz� ...<br />
Ez egy szö <a href="">&raquo;</a><br />
Megosztás/Mentés

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.

Megosztás/Mentés

Ifsetor és kukac operátor php 5.3 -ban

A PHP 5.3 -ban bevezettek egy nem nagyon hangoztatott operátort. Aminek a függvény alakja az „ifsetor” névre hallgatott volna. Azt viszont elvetették a fejlesztők. Az operátor hasonló a már rég ismert és más nyelvekben is használt ternáris operátorhoz.

echo $x ?: $default;

Gyakorlatilag a következő kód rövidítése:

echo $x ? $x : $default;

Tehát:

$x = 0;
echo $x ?: 20;

Kiírja, hogy 20, mert az $x logikai hamissá konvertálható. De a

$x = 12;
echo $x ?: 20;

Kiírja, hogy 12, mert az $x itt már logikai típusként igaz értéket venne fel.

Persze személy szerint azt hiszem, ezzel kaptunk egy nem túl hasznos, ámde érdekes operátort. Ugyanis erre így nem gyakran van szükség. Talán csak a következő példát tudnám most hirtelen elképzelni:

Megosztás/Mentés

Többdimenziós tömbök értékeinek szelektív lekérdezése php-ban

Az ötletet a különböző keretrendszerekben megtalálható hasonló metódusok adták, amik adatbázisból lekérdezett eredményhalmaz átrendezésére használhatók. A különböző rekordokat egy kétdimenziós tömbben is visszakaphatjuk, ami vagy numerikusan indexelt, vagy valamelyik adott oszlop értéke szerint. Például felhasználó azonosítója. Az összetett kulcsok által indexelésre viszont ezek sem adnak megoldást. Továbbá vannak olyan helyzetek, amikor egy tömbből konkrét indexekhez ( oszlopokhoz ) tartozó értékekre van szükség és csak azokra. Erre talán azt tudnám példaként említeni, amikor egy nem általunk írt függvény az átadott összes tömbelemet feldolgozza. Ezeken túl a következő függvény a nem létező indexekhez tartozó értékeket figyelmen kívül hagyja.

Példa tömb:

$array = array(
        4 => array('id' => 1, 'name' => 'Takács Ákos','age' => 25),
        8 => array('id' => 345, 'name' => 'Kovács Géza', 'age' => 31),
        1 => array('id' => 13, 'name' => 'Tóth Töhötöm', 'age' => 12),
        56 => array('id' => 98, 'name' => 'Teszt Eszter', 'age' => 43)
);

Példa select lista készítéséhez

<?php
$persons = fetch($array, 'name', 'id');
?>
<select name="persons">
<?php foreach ($persons as $id => $name) : ?>
        <option value="<?php echo (int)$id; ?>"><?php echo htmlspecialchars($name); ?></option>
<?php endforeach; ?>
</select>

Eredmény:

<select name="persons">
        <option value="1">Takács Ákos</option>
        <option value="345">Kovács Géza</option>
        <option value="13">Tóth Töhötöm</option>
        <option value="98">Teszt Eszter</option>
</select>

További példák a használatára:

Megosztás/Mentés