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.

Megosztás/Mentés

"Objektumorientált" Drupal - A reflection osztályok haszna

Nem rég el kellett kezdenem drupalban fejleszteni. Számomra nagyon új és furcsa volt, hogy gyakorlatilag sehol egy igazi osztály, vagy az objektumorientáltság jele. Ez annyiban érdekes, hogy számomra egy jól strukturált OOP-re épülő forráskód sokkal érthetőbb, mint függvények sokasága, ahol ráadásul minden függvény ott lebeg a globális térben. Az is, ami kizárólag a modulnak kell. Ugyanez a változókkal. Na most kezdő drupalosként, hogy otthonosabban érezzem magam a forráskódban, megpróbáltam kierőszakolni az osztályok használatát úgy, hogy közben kigenerálom a függvényeket is, de csak azokat, amiket a drupalnak meg kell tudni hívni automatikusan. Hangsúlyozom, hogy a következő megoldást az ötlet és a megvalósítás miatt teszem közzé. Nem ajánlásként.

Megosztás/Mentés

PHP jelentősebb változásai napjainkig - Kezdetektől a trait-ekig

Emlékszem, mikor még a PHP 4 volt számomra az egyetlen verzió. Majd igen késve belekóstoltam a PHP 5-be és tetszett, amit láttam. Azóta is folyamatosan fejlődött. Kapott új függvényeket is, de mégsem volt olyan látványos a változás. Hozzáteszem, a unicode változónevek használata sem jelentéktelen, ami már 5.3 előtt is létezett, de a valódi haszna mégis megkérdőjelezhető. Majd az 5.3 -as verzióban többek között bevezették a névtereket. Persze nem nagyon volt még akkor olyan szerver, ahol ez a verzió futott volna. És mivel névterek nélkül is jól megvoltam addig, ezt a funkciót inkább nem is használtam. De az idő nem állt meg és elértünk az 5.2-es széria támogatottságának végéig. Amikor már mindenkit az 5.3-ra való átállásra ösztönöznek a PHP nyelv fejlesztői. Egyelőre még mindig több szerveren csak 5.2 van. Többek között a rimelek.hu szolgáltatóján is. Tervezik viszont ők is, hogy bevezetnek 5.3-as szervert is, amire kérésre át lehet majd kerülni. Van ingyenes szolgáltató, ami már korábban váltott. Ilyen a Freeweb.hu is. Lehet több is van. Nem néztem utána. Már 5.3.8 -nál tart ez a széria. És bár korábban sokan hallhattak a 6-os verzióról, a következő az 5.4 lesz.

A PHP 5.4 ismét olyan újításokat vezet be, ami miatt megint lehet egy kicsit dicsérni a nyelvet. De hogyan jutottunk ide?

Megosztás/Mentés

Egyszerű helyesírás-ellenőrző PHP-val. - pspell könyvtár

Egy kis helyesírás-ellenőrző programot fogok mutatni, amihez a PHP pspell könyvtárát használtam. Lényegében 3 függvényt használtam fel. Ezek pedig a pspell_new, pspell_check és pspell_suggest. Ezekkel már elérhető, hogy egy magyar szótár alapján az egyes szavak helyességét vizsgáljuk. Központozást és egyéb mondattani jellemzőket nem néz.

Szükséges

hozzá az aspell csomag. Illetve magyar szótárhoz az aspell-hu is. Ezen kívül a php5-pspell könyvtár kell, amit linuxon ( debian, ubuntu ) vagy apt-get -tel kell feltelepíteni, vagy aki a php-t is saját maga fordítja, az a --with-pspell kapcsolót kell használja. Ahhoz viszont szükséges előbb a libpspell-dev csomag is.

pspell_new

Ezzel lehet egy új szótárt megnyitni. Az első paraméterben a „hu_HU” megadja, hogy magyar szótár kell. A második paraméter különböző nyelvjárások megadására szolgál, mint például amerikai, brit, kanadai angol. Megadható zsargon is, de most a fontosabb két paraméter a 4. és 5. Ezek sorban a karakterkódolás és a mód. A móddal korlátozható a hibás szavakra adott javítási javaslatok száma. Én a leggyorsabb és legkevesebb javaslatot adó PSPELL_FAST konstanst adtam meg.

pspell_check

Ezzel lehet ellenőrizni egy szót. Fontos, hogy minden átadott string egy szónak számít. Tehát a mondatok szavakra darabolását meg kell oldani. Beleértve az írásjeleket is.

pspell_suggest

Végül pedig maradt a javaslatok lekérdezése. A javaslatokat ez a függvény tömbként adja vissza.

Helyesírás-ellenőrző program

Demo-t sajnos nem tudok mutatni, mert a tárhelyemen nincs telepítve a pspell. Ezért csak leírom, mit tud a program. Egy megadott szövegben megkeresi a hibás szavakat, majd azokat aláhúzva és kiemelve pirossal, megjeleníti. A hibás szavakra kattintva megjelennek a javaslatok, ha az űrlapon ez az opció ki van pipálva. Lehetne tovább cifrázni azzal, hogy a javaslatra kattintva a szövegben lecseréli a szót, de ezt én most nem oldottam meg.

És a program forráskódja:

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:

  1. $x = 0;
  2. echo $x ?: 20;

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

  1. $x = 12;
  2. 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:

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

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

  1. <?php
  2. $persons = fetch($array, 'name', 'id');
  3. ?>
  4. <select name="persons">
  5. <?php foreach ($persons as $id => $name) : ?>
  6.         <option value="<?php echo (int)$id; ?>"><?php echo htmlspecialchars($name); ?></option>
  7. <?php endforeach; ?>
  8. </select>

Eredmény:

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

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

Megosztás/Mentés

Triggerek használata MySQL-ben

Triggerek a MySQL 5.0 óta léteznek. Egy trigger bizonyos táblaműveletek hatására kiváltódó események kezelésére szolgál, amiben tárolt eljáráshoz hasonló szintaktikával további műveletek végezhetők. Bár még nem olyan kifinomult a MySQL trigger, mint például Oracle-ben, de be fogom mutatni, hogy így is hasznos szolgálatot tehet, amennyiben van jogosultságunk a használatára.

Triggerek létrehozása:

Egy utasítás esetén:
create trigger triggerneve  mikorfusson milyenmuveletre for each row sqlutasitas;
Több utasítás esetén:

  1. delimiter $$
  2. create trigger triggerneve  mikorfusson milyenmuveletre
  3.       /*További sql utasítások*/
  4. end$$
  5. delimiter ;

mikorfusson: Lehet before vagy after.
Azaz egy művelet előtt is lefuthat, vagy csak az után.

milyenmuveletre: Lehet insert, update vagy delete

A „create” előtti sorra azért van szükség, mert a trigger törzsében levő sql utasítások utáni pontosvessző lezárná a triggert is. Meg kell tehát változtatni a delimitert, azaz az utasításokat határoló karaktert. A trigger lezárása után pedig vissza lehet azt állítani. Most pedig jöjjön egy életszerű példa a triggerek használatára!

Megosztás/Mentés

R.E. Uploader

Bár az osztályt nem ma írtam, de most érett meg a publikálásra. Segítségével egyszerűbben, felhasználóbarátabban oldható meg fájlok feltöltése és képek esetén thumbnail kép automatikus készítése. A maximális fájlméret és fájltípus korlátozható. A fájlok neve és könyvtára is megadható. Eredeti és kép esetén thumbnail képek könyvtára is. Fájlnév egyezés esetén a fájlok felülírhatók, vagy kaphatnak numerikus megkülönböztető jelet. Pl.: "_1". A fájlok egyelőre minden esetben csak url barát formában menthetők el. Tehát nincs se szóköz, se speciális karakter. Ezek automatikusan lesznek lecserélve ékezetmentes karakterekre. Vagy speciális karakterek esetén a rájuk leginkább hasonlító egyszerű karakterre.

Legújabb verzió letöltése sourceforge-ról

Megosztás/Mentés

PHP SVN project létrehozás assembla.com-on és tesztelés NetBeans -ben

2012. május 27-én a bejegyzés kiegészítve Windows felhasználók számára. A kiegészítések pirossal kiemelt dátummal jelöltek.

Azok kedvéért, akik még nem próbáltak verziókezelő rendszert használni: Több féle lehetőség létezik. git, CVS vagy akár az SVN, amiről én írok most. De egyébként jó hosszú a lista. Akit érdekel: Verziókezelő rendszerek, Verziókezelés

Hasznos dolog, mert egy szerveren megtalálható az összes fájl összes verziója, amiket vissza is lehet állítani szükség esetén. Illetve pontosan követhetők a változások. Csapatmunka esetén ki, mit módosított. Illetve bizonyos esetekben ugyanazon a fájlon több fejlesztő is dolgozhat. Más esetben ez hibát okoz, aminek a javítására vannak lehetőségek.

Vannak fejlesztői környezetek, amik támogatják a verziókezelő rendszereket. NetBeans is ilyen. CVS, Mercurial és Subversion ( SVN ) van beépítve. Ingyenes szervereket is lehet találni. Korlátozottan bár, de ilyen az Assembla.com (A fizetős verziója többet tud). Viszont lehet privát projektet is kérni. Ellentétben sourceforge.net -tel (2012. május 27.: Azóta már itt is), ahol viszont sokkal több lehetőség és eszköz használható teljesen ingyen. De nem is részletezném tovább. A tárgyra térek.

Mint írtam, netbeanst használok és SVN-t. Valamilyen PHP programot szeretnék "verziókezelni". Létrehozom a projectet, beállítom az SVN-t és módosítgatok. Tesztelgetek. Létrejönnek cache fájlok esetleg, képek vagy kitöltött, helyi gépre beállított config fájlok amiket nem szeretnénk commitolni. NetBeans-ben van lehetőség commit előtt egy listában jelölgetni, miket akarunk felküldeni a szerverre és miket nem. Vagy előre beállítani, hogy egy bizonyos mappát, fájlt sose töltsön fel. De még ekkor is el lehet veszni a fájlok között. Nem beszélve arról, hogy a netbeans projekt fájljai is bekerülhetnek ide, ha létrehozáskor nem lett megadva, hogy külön mappában tárolja a config állományokat a projekthez. Illetve nem biztos, hogy az alkalmazás fel van készítve arra, hogy minden mappába bekerül egy .svn nevű mappa is fájlokkal. Szóval nézzünk lépésről lépésre egy projectet az assembla.com -on.

Megosztás/Mentés