- - = DATA MINING = - -
aneb odborne oznaceni asi nejcastejsiho dotazu - jak vydolovat z nejakeho textu nejakou konkretni cast...
reseni zalezi na tom, jestli se jedna o XML, JSON a nebo jiny predem nespecifikovany text:
1. JSON - nejjednodussi (a nejmene caste) - pouzijeme json_decode a nechame si od php vratit objekt - pak uz jenom pristoupime k tomu, co potrebujeme
(json_decode muze vratit i pole - pokud je to klasicke indexovane, jinak vraci objekt)
2. XML/HTML (nejcastejsi) - tady jsou reseni 2 - bud regexy a nebo simplexml/dom+xpath:
http://php.net/simplexml
http://php.net/dom
http://www.w3.org/TR/xpath20/
http://interval.cz/clanky/zaklady-jazyka-xpath/
http://www.zvon.org/xxl/XPathTutoria.../examples.html
Ve zkratce:
priklady xpath:PHP kód:<?php
$dom = new DOMDocument ();
$dom -> loadHTML ( '<div class="anchor-div"><a href="anchor1url">anchor 1</a></div><div class="anchor-div"><a href="anchor2url">anchor 2</a></div><a href="anchor3url">this anchor is not inside div</a>' );
$xml = simplexml_import_dom ( $dom );
//vypise vsechny divy s tridou anchor-div
foreach ( $xml -> xpath ( "//div[@class='anchor-div']" ) as $anchor_div )
echo $anchor_div -> asXML (), "\n";
//vypise vsechny anchory
foreach ( $xml -> xpath ( "//a" ) as $anchor )
echo $anchor -> asXML (), "\n";
//vypise vsechny url ze vsech anchoru
foreach ( $xml -> xpath ( "//a/@href" ) as $anchor_url )
echo $anchor_url, "\n";
//vypise vsechny url ze vsech anchoru uvnitr divu
foreach ( $xml -> xpath ( "//div/a/@href" ) as $anchor_url )
echo $anchor_url, "\n";
//vypise url z posledniho anchoru
foreach ( $xml -> xpath ( "//a[last()]/@href" ) as $anchor_url )
echo $anchor_url, "\n";
http://msdn.microsoft.com/en-us/library/ms256086.aspx
http://www.w3schools.com/XPath/xpath_examples.asp
http://www.zvon.org/xxl/XPathTutoria.../examples.html
3. regexy - HTML/XML/jakykoliv textovy obsah
regularni vyrazy jsou v php zastoupeny jak temi POSIXovymi, tak temi PERLovskymi (PCRE), ty prvni jsou pomale, slabe, ale jsou standard - umi je grep, sed, gvim, ale taky notepad2, total commander, a pravdepodobne jeste spousta dalsich programu.
Vetsinu z Vas budou ale zajimat ty druhe, cili preg - jsou podporovane ve vsech hlavnich programovacich jazycich (ikdyz se jejich implementace trosicku odlisuje) - tzn. Java, Javascript, PHP a samozrejme Perl, urcite bude existovat i nejaka knihovna pro C a C++, ale nas zajima tentokrat jenom PHP. Popisovat to cele znovu by bylo asi zbytecne, takze sem hodim par odkazu pro nastudovani a pak par ukazek pouziti:
http://interval.cz/clanky/perl-compa...ni-konstrukce/ - perfektni serial na intervalu
http://php.net/manual/en/book.pcre.php - seznam fci, ktere mame k dispozici v pripade PCRE
http://www.php.net/manual/en/referen...ern.syntax.php - manualova stranka popisujici syntax PCRE - je to zahrabane celkem hluboko v dokumentaci, tak to sem supnu primo...
http://www.regextester.com/ - tester regexu - umi javascript, preg (php) i posix - urcite se bude hodit...
http://www.sitepoint.com/blogs/2006/...expressions-1/ - hezky tutorial na sitepointu
priklady:
doporucuju vyzkouset si a pohrat si s tim...PHP kód:<?php
$html = '<div class="anchor-div"><a href=\'anchor1url\'>anchor 1</a></div><div class="anchor-div"><a href="anchor2url">anchor 2</a></div><a class="foo" href="anchor3url">this anchor is not inside div</a>';
//tyto 3 priklady vypisou vzdy to same - pole poli, kde kazdy prvek obsahuje: cele html odkazu, pak url odkazu a pak text odkazu...
//lisi se jenom tim, ze ty slozitejsi budou fungovat i na neobykle odkazy typu: <a class="" href="">, kdezto ty jednodussi ne...
//parsnuti obvykleho odkazu (neni 100%ni)
if ( preg_match_all ( '%<a href="(.*?)">(.*?)</a>%si', $html, $matches, PREG_SET_ORDER ) )
print_r ( $matches );
//to same, tentokrat zvlada i rozdilne uvozovky ("') - ve vyslednem poli bude jeste jeden prvek navic, ten bude obsahovat bud ' a nebo "
if ( preg_match_all ( '%<a href=(["\'])(.*?)\1>(.*?)</a>%si', $html, $matches, PREG_SET_ORDER ) )
print_r ( $matches );
//a tentokrat zvladneme i vice mezer a libovolnou pozici href atributu
if ( preg_match_all ( '%<a[^>]*\s+href=(["\'])(.*?)\1[^>]*>(.*?)</a>%si', $html, $matches, PREG_SET_ORDER ) )
print_r ( $matches );
jinak u regexu obecne plati, ze napiseme takovy regex, ktery dostacuje nasemu pouziti, protoze napsat 100%ne neprustrelny (a zaroven fungujici) vyraz by nam zabralo neporovnatelne vetsi mnozstvi casu (tudiz doporucuju jit spise cestou prvnich prikladu, pokud si nejste tak uplne jisti)
- - = MOD_REWRITE = - -
jeste takova rychla vsuvka na tema mod_rewrite - ne ze bych na to byl extra odbornik, ale vetsina problemu je zpusobena tim, ze v .htaccess chybi tohle:
tento radek by mel byt umisteny hned za RewriteEngine On, jak je uvedeno...Kód:RewriteEngine On RewriteBase /
tema se bude rozsirovat - ale chce to cas :-) a mozna, ze ho taky rozdelim do vice temat, podle kategorii, uvidime, kolik bude materialu...



