Névjegyek

Általános php tartalom elemző. Tartalomelemző írása PHP-ben. Egy fájl olvasása PHP-ben soronként a fgets () segítségével

Úgy döntöttem, hogy naprakészen tartom a cikket. Korábban ezen az oldalon bemutattak egy univerzális HTML oldalelemzőt a PHP-ben. De több mint 4 év telt el, több tapasztalatot szereztem az elemző fejlesztés területén. És úgy döntöttem, hogy felteszek egy új példát egy PHP elemzőre, a művelet algoritmusának részletes elemzésével.

Az előző verzió elemzője az univerzál büszke címet viselte, de nagyon konvencionális megnevezés volt. A szkriptnek sok korlátja volt, teljes felhasználásához a PHP és JS rendszeres kifejezéseinek ismeretére volt szükség.

Gondoltam, gondoltam, és úgy döntöttem, hogy egy univerzálisabb megoldás az, ha a PHP-ben bemutatok egy elemző példáját, és elmondom, hogyan működik. Tehát azok a programozók, akik korábban nem írtak elemzőket, képesek megoldani problémáikat. Az ügyfelek pedig meg fogják érteni a PHP képességeit a webes kaparás terén, és azt, hogy mit követelhetnek meg valóban a programozók.

Elemző Olyan program, amely elemzi a bemenő szöveges adatokat, kivonja a szükséges információkat, és a kapott adatok alapján egy adott formátumban állítja elő az eredményt.

Az általános PHP elemzési algoritmus feltételezi, hogy a szkript kérést küld egy adott címre, választ kap a szervertől HTML oldal formájában vagy más szöveges formátumban, például CSV, JSON, XML. A továbbiakban elemzik a beérkezett információkat, kivonják (elemzik) a szükséges adatokat, amelyek alapján kialakul az eredmény. A beérkezett adatok megjeleníthetők a képernyőn, vagy fájlba vagy adatbázisba írhatók.

Példa egy egyszerű PHP html tartalom elemzőre

Tegyük fel, hogy szeretnénk elemezni az áruk árát a gearbest.com oldalon. A szkript elolvassa az adott oldalt, majd a reguláris kifejezések segítségével elemzi annak tartalmát és kiválasztja a HTML kód szükséges darabjait. Ezután az eredmény megjelenik a képernyőn.

/ Us "; $ buffer = tömb (); preg_match ($ regexp, $ page, $ buffer); $ res_arr [" price_list "] [" currency "] = $ buffer; $ res_arr [" error "] =" "; ) else ($ res_arr ["price"] = 0; $ res_arr ["currency"] = "nodata"; $ res_arr ["error"] = "Oldalbetöltési hiba";) return $ res_arr;) / * --- 1.4 --- Adatok kimenete HTML-be * / / * --- 1.4.1 --- Fogadott árak kiadása * / function price_list_html ($ price_list) (visszhang "

Ár: ". $ Árlista [" ár "]." ". $ price_list [" valuta "]."

";) / * --- 1.4.2 --- Hibakimenet * / function error_list_html ($ hiba) (ha (! Üres ($ hiba)) (echo"

A kérelem feldolgozása során a következő hibák történtek:

\ n "; visszhang"
    \ n "; foreach ($ hiba, mint $ error_row) (echo"
  • ". $ error_row."
  • \ n ";) visszhang"
\ n "; visszhang"

Állapot: HIBÁS

\ n ";) else (echo"

Állapot: rendben

\ n ";)) / * --- 1.4.3 --- Az oldalbetöltési hibák kimenete * / function error_page_list_html ($ error_page) (if (! empty ($ error_page)) (echo"
    \ n "; foreach ($ error_page mint $ error_row) (echo"
  • [". $ error_row."] ". $ error_row." - ". $ error_row."
  • \ n ";) visszhang"
\ n ";)) / * --- 1.4.4 --- A parancsfájl működésének kimenete * / function run_time_html ($ time_start) (if (! empty ($ time_start)) echo"\ n ";) / * --- 2 --- Tartalom beolvasása a Gearbest katalógusból * / if ($ action) (// ha nincs hiba, és a keresési űrlap adatai megkapják, ha (! empty ($ gearbest_url) ) ($ gearbest_url = trim ($ gearbest_url); $ din_url = $ gearbest_url; $ res_arr = get_gearbest_price ($ din_url); $ price_list = $ res_arr ["price_list"]; $ error_page = $ res_arr ["hiba_oldal"]; = $ res_arr ["error"];) else ($ error = "A termékoldal címe nincs megadva";)) / * --- 3 --- Az elemző eredmények kimenete * /?>

Termékár-elemző a Gearbest.com oldalon

!}


index.php- az elemző fő PHP szkriptfájlja. Az értelmező kód a közzététel pillanatában aktuális. Idővel a forrás webhely HTML-kódja megváltozhat, és a reguláris kifejezések már nem fognak egyezni vele.

A szkript telepítésének különböző módjai vannak. XAMPP alól dolgoztam vele. De az elemzőt közvetlenül futtathatja. Csak töltse fel a fájlt index.php bármelyik mappában a webhelyére, és a böngésző címsorán keresztül érheti el. Tegyük fel, hogy a szkriptet a saját mappámba helyezte -elemző a tárhely gyökérkönyvtárában. Ezután a címsorba be kell írnia az URL-t: http: //yourdomain.ru/my-parser/.

Pillanatkép az árelemző főoldaláról a gearbest.com webhelyről:

1. Az elemző főoldalán be kell írnunk a termékoldal címét. A "Start" gombra kattintás után az oldal újratöltődik, az űrlap adatait elküldjük a szervernek, és a PHP szkript kérést küld a megadott címre a cURL könyvtár segítségével.

A funkció felelős ezért a műveletért curl_get_contents (), amely analóg a standard PHP funkcióval file_get_contents () de fejlett cURL-alapú funkcionalitással.
becsavar PHP kiterjesztés, amely támogatja a libcurl függvénykönyvtárat. Ez a funkciókészlet lehetővé teszi POST és PUT kérések formázását, fájlok letöltését. Különféle protokollok, http, https, ftp stb. Támogatottak. Használhat proxy szervereket, cookie-kat és felhasználói hitelesítést. Összességében remek eszköz a felhasználói műveletek szimulálására a böngészőben.

A cURL egy nagyon hasznos eszköz a HTML-elemzők fejlesztéséhez, és az egyik oldalon részletesebben beszélek arról, hogyan kell vele dolgozni elemzési célokra.

Felhívjuk figyelmét, hogy a szkript az oldalt szöveges formátumban látja, és HTML-kódját elemezni kell.

3. A következő szakaszban az elemzés után kapott adatok alapján kapott eredmény generálódik és megjelenik a képernyőn. Esetünkben ez a termék pénzneme és ára.

Így a parserek sikeres fejlesztéséhez a PHP-ben a programozónak képesnek kell lennie a funkciók és a PHP reguláris kifejezések könyvtárának használatára.

A titkosított adatok elemzése

Bizonyos esetekben a szerverek tömörített vagy titkosított formátumban küldenek HTML-oldalakat, például Accept-Encoding: gzip. Ugyanakkor a támogatott tömörítési formátumok megváltoztatása a kérelemben nem befolyásolhatja a válasz formátumát.

Ilyen esetekben dekódolnia kell a választ, például a szokásos PHP funkcióval gzdecode ().És akkor a régi rendszer szerint lehet majd dolgozni.

A Base64 által kódolt adatokat a funkció visszafejtheti base64_encode ().

PHP elemző HTML webhely ingyen

Valójában arra a kérdésre, hogy hol lehet ingyen beszerezni egy PHP site elemzőt, a válasz egyszerű - írja meg maga. A parserek munkájának alapvető algoritmusa, amelyet fent részletesen elemeztem.

Kereshet kész, korábban valaki által írt megoldásokat a problémájára. De valószínűleg nem lehet olyan elemzőt létrehozni, amely automatikusan illeszkedik az összes lehetőséghez. Minden feladattípushoz ki kell dolgoznia saját saját termékét.

Azok számára, akik nem akarnak a reguláris kifejezésekkel és az értelmező beállításokkal bajlódni, készen állok arra, hogy teljesítsem az Ön számára, de természetesen pénzbe fog kerülni :-).

A fejlesztési szolgáltatások teljes költségét egy meghatározott technikai feladat kézhezvétele után határozzák meg. Az árat szigorúan a munka megkezdése előtt határozzák meg, a munkafolyamat során az anyagi feltételek nem változnak. Dolgozom tovább 100% előleg... A minimális rendelés 2000 rubel.

Az elemző ára gyakran meglehetősen magas, és ez annak a ténynek köszönhető, hogy a fejlesztés kiderül, hogy egyedi, egy adott ügyfélre szabott. A dinnye bemenetének különböző lehetőségei vannak, egyedi kimeneti formátumra van szükség.

Ebben az esetben hivatalosan ingyen is beszerezhet egy elemzőt. Például az elemző fejlesztésének ára 9000 rubel. 9 embert keres hasonló problémával, és 1000 rubelt szed be tőlük, rendelje meg az elemző fejlesztését. Ezután 10 példányt készít, egyet magának és 9-et a barátainak.

A következő cikksorozatban példákat mutatok be a bonyolultabb elemzők stb.

Általában kedves olvasóim, mit tehetnék, hogy segítsek, olvassak, tanuljak és ne felejtsem el linkelni a blogot.

Ha elemeznie kell egy HTML dokumentumot, akkor a rendszeres kifejezések nem a legjobb módszerek erre. Ezenkívül ezek megírása fáradságos folyamat, és lassítják a PHP-alkalmazások sebességét. Ebben a cikkben megtudhatja, hogyan használhat egy ingyenes HTML elemzőt néhány DOM elem olvasására, módosítására és kibontására HTML oldalakról. Sőt, a HTML erőforrás külső forrás is lehet. Vagyis egy másik domain HTML-oldalának URL-je. Például a webhelyet használva szitár.ru, megtanulja, hogyan szerezheti meg és jelenítheti meg az összes közzétett anyag listáját a webhely honlapján. Más szavakkal, azt fogja csinálni, amit meg kell tennie, a HTML elemzését PHP-vel. Ebben az esetben a PHP az egyszerű HTML DOM könyvtárra utal.

Csak kövesse a cikk összes lépését, és rengeteg új és hasznos dolgot tud meg magának!

1. lépés - előkészítés

Először le kell töltenie a egyszerű HTML dom könyvtárak. Ingyenes letöltés.

Az archívumban több fájlt talál, de csak egyre van szükségünk - simple_html_dom.php... Az összes többi példa és dokumentáció.

2. lépés - A HTML elemzésének alapjai

Ez a könyvtár nagyon könnyen használható, de ennek ellenére meg kell értenie néhány alapot, mielőtt használná.

$ html = new simple_html_dom (); // Betöltés karakterláncból $ html-> load ("

Helló Világ!

"); // Fájl betöltése $ html-> load_file (" http: // site / ");

Ez egyszerű: létrehozhat egy objektumot, ha HTML-t tölt be egy karakterláncból. Vagy töltsön be egy HTML-kódot egy fájlból. A fájlt URL-címen vagy a helyi fájlrendszerről (szerverről) töltheti le.

Fontos megjegyezni: A load_file () metódust a PHP file_get_contents függvénye hajtja. Ha a php.ini fájlban az allow_url_fopen paraméter nincs igazra állítva, akkor nem fog tudni HTML fájlokat fogadni a távoli címre. De ezeket a fájlokat a CURL könyvtár segítségével töltheti be. Ezután olvassa el a tartalmat a load () módszerrel.

HTML DOM objektumok elérése


Tegyük fel, hogy már van egy DOM objektumunk, olyan szerkezettel, mint a fenti képen. Elkezdheti a munkát a find () módszerrel és gyűjtemények létrehozásával. A gyűjtemények objektumok csoportjai, amelyek szelektorok segítségével találhatók - a szintaxis némileg hasonlít a jQuery-re.

Helló Világ!

Itt voltak.



A HTML-példa segítségével megtudhatjuk, hogyan férhetünk hozzá a második bekezdésben (p) található információkhoz. Ezenkívül megváltoztatjuk a kapott információkat és megjelenítjük az eredményt a kijelzőn.

// elemző objektum létrehozása és a HTML include beolvasása ("simple_html_dom.php"); $ html = new simple_html_dom (); $ html-> load ("

Helló Világ!



"); // bekezdéstömbök beolvasása $ element = $ html-> find (" p "); // információ megváltoztatása a $ element-> internaltext. =" bekezdésen belül "= és itt maradunk. // visszhang kimenet $ html-> save ();

Mint látható, nagyon egyszerű megvalósítani egy HTML dokumentum PHP elemzését az egyszerű HTML DOM könyvtár segítségével. Alapvetően ebben a PHP-kóddarabban mindent intuitív módon lehet megérteni, de ha kétségei vannak, megnézzük a kódot.

2-4 sor: összekapcsoljuk a könyvtárat, létrehozunk egy objektumot az osztályból és betöltöttük a HTML kódot a karakterláncból.

7. sor: Ezzel a vonallal mindent megtalálunk

címkéket HTML-kódban, és tárolja őket egy változóban tömbként. Az első bekezdés indexe 0 lesz, a többi bekezdést ennek megfelelően indexelik 1,2,3 ...

10. sor: Gyűjteményünkben megkapjuk a második bekezdés tartalmát. Az indexe 1. A belső szöveg attribútum használatával változtatunk a szövegen is. A belső szöveg attribútum megváltoztatja a megadott címke összes tartalmát. Magát a címkét is megváltoztathatjuk a externaltext attribútummal.

Vegyünk még egy sor PHP-kódot, amellyel stílusstílust rendelünk a bekezdésünkhöz.

$ element-> class = "osztálynév"; echo $ html-> save ();

A kódunk végrehajtásának eredménye a következő HTML dokumentum lesz:

Helló Világ!

Itt vagyunk és itt vagyunk, hogy maradjunk.



Egyéb választók

Az alábbiakban további példák találhatók a választókra. Ha a jQuery-t használta, az egyszerű html dom könyvtár szintaxisa kissé hasonló.

// az első elem megszerzése az id = "foo" $ single = $ html-> find ("# foo", 0); // megkapja az összes class class = "foo" elemet a $ collection = $ html-> find (". foo") elemzésekor; // megkapja az összes címkét html dokumentum elemzésekor $ collection = $ html-> find ("a"); // megkapja az összes címkét amelyeket a címkébe helyeznek

$ collection = $ html-> find ("h1 a"); // az összes kép megkapása = = ((! LANG: himom" $collection = $html->find("img"); !}

Az első választó használata a php elemzéséhez egy html dokumentum nagyon egyszerű és egyértelmű. Egyedisége, hogy csak egy html elemet ad vissza, ellentétben másokkal, amelyek egy tömböt (gyűjteményt) adnak vissza. A második (0) paraméterrel jelezzük, hogy csak gyűjteményünk első elemére van szükségünk. Remélem, megértette az egyszerű HTML DOM könyvtár összes kiválasztóját, ha valamit nem ért, próbálja ki a tudományos kísérlet módszerét. Ha még ő sem segített, olvassa el a cikk kommentjeit.

Egyszerű HTML DOM könyvtár dokumentáció

Az egyszerű HTML DOM könyvtár használatának teljes dokumentációja ezen a helyen található:

http://simplehtmldom.sourceforge.net/manual.htm

Csak egy illusztrációt adok, amely bemutatja a kiválasztott HTML DOM elem lehetséges tulajdonságait.


3. lépés - Valódi példa a PHP elemzésére a HTML dokumentumban

Például a HTML DOM könyvtár elemzésére és működésbe hozatalára egy anyag-grabert írunk a webhelyre. Ezután az összes cikket egy lista formájában jelenítjük meg, amely tartalmazza a cikkek nevét. Fogásíráskor ne feledje, hogy a tartalom lopását törvény bünteti! De nem akkor, ha az oldalon aktív link van az eredeti dokumentumra.


Belefoglalás ("simple_html_dom.php"); $ cikkek = tömb (); getArticles ("http: // site /");

A könyvtár összekapcsolásával és a függvény meghívásával kezdjük getArticles, amely elemzi a HTML dokumentumokat az oldal címe szerint, amelyet paraméterként adnak át a függvénynek.

Jelölünk egy globális tömböt is, amely a cikkekkel kapcsolatos összes információt tárolja. Mielőtt elkezdenénk elemezni egy HTML dokumentumot, nézzük meg, hogy néz ki.

Ez az oldal sablonja. Html elemző írásakor alaposan meg kell vizsgálnia a dokumentumot, például a megjegyzéseket, ezek is leszármazottak. Más szavakkal, az egyszerű HTML DOM könyvtár szemében ezek olyan elemek, amelyek egyenértékűek az oldal többi címkéjével.

4. lépés - Az alapvető PHP HTML elemző függvény megírása

függvény getArticles ($ page) (globális $ articles; $ html = new simple_html_dom (); $ html-> load_file ($ page); // ... tovább ...)

A függvény elején hívjuk a korábban megadott globális tömböt. Hozzon létre egy új simple_html_dom objektumot. Ezután töltse be az elemezni kívánt oldalt.

5. lépés - A szükséges információk megtalálása

$ items = $ html-> find ("div"); foreach ($ items as $ names) ($ articles = tömb ($ post-> gyermekek (0) -> sima szöveg);)

Ebben a kóddarabban minden rendkívül egyszerű, az összes div-ot megtaláljuk, amelynek class = name_material. Ezután elolvassuk az elemek gyűjteményét, és kiválasztjuk az anyagok nevét. Minden anyag a tömbben a következő formában kerül mentésre:

$ articles = "1. anyag neve"; $ articles = "2. anyag neve"; ...

6. lépés - Az elemzési eredmény megjelenítése

Először néhány stílust állítunk be a megjelenített információk szépségéhez, amelyeket az elemzés során kaptunk.

Elem (kitöltés: 10 képpont; szín: # 600; betűtípus: félkövér 40 képpont / 38 képpont képpontos helvetica, verdana, sans-serif;)

"; echo $ item; echo"

"; } ?>

A szkript végrehajtásának eredménye a cikk cikkeinek listája lesz a webhelyen.

Következtetés

Megtanultuk tehát a html dokumentumok php elemzését. Ne feledje, hogy az elemzés hosszú folyamat. Egy oldal kb. Egy másodpercig elemezhető. Ha nagy számú HTML-dokumentumot elemez, a szerver megszakíthatja a szkriptet a végrehajtásra kijelölt idő lejárta miatt. Ez a set_time_limit (240) függvénnyel javítható; A 240 a másodpercben megadott idő a szkript végrehajtására.

Ez a cikk végigvezeti Önt a HTML oldal PHP használatával történő elemzésének alapelvein. Vannak más könyvtárak és elemzési módszerek is. Ha ismered ezeket, oszd meg a megjegyzéseket. Örömmel fogom tudni, hogy milyen html elemző eszközöket és módszereket használsz.



A webhelyoldal elemzéséhez (vagyis annak HTML-kódjának elemzéséhez) először meg kell szereznie. Ezután a már megszerzett kód értelmezhető reguláris kifejezésekkel, és vagy elemezhető valamilyen módon, vagy elmenthető az adatbázisba, vagy mindkettő.

Webhelyek letöltése a file_get_contents használatával

Tehát először tanuljuk meg, hogyan lehet a webhelyeket PHP-változóvá tenni. Ez a funkció használatával történik file_get_contents, amelyet leggyakrabban fájlokból származó adatok megszerzésére használnak, azonban felhasználható egy webhelyoldal megszerzésére - ha paraméterként nem a fájl elérési útját adja meg, hanem a webhely oldal URL-jét.

Felhívjuk figyelmét, hogy ez a funkció nem ideális, és van egy erősebb analóg - a könyvtár Becsavar, amely lehetővé teszi a sütikkel, a fejlécekkel való munkát, lehetővé teszi az űrlapok beküldését és az átirányítások követését. Ez mind file_get_contents nem tudja, hogyan kell csinálni, azonban kezdetben jól fog dolgozni, és együtt fog dolgozni Becsavar a következő leckében foglalkozunk vele.

Tehát keressük meg például a webhelyem kezdőlapját, és jelenítsük meg a képernyőn (tegye ezt):

Amit ennek eredményeként kap: a képernyőn megjelenik a webhelyem egy oldala, de valószínűleg CSS-stílusok és képek nélkül (hogy a CSS és a képek működnek-e, a webhelytől függ, miért így van - később elemezzük).

Most ne a webhely oldalt jelenítsük meg, hanem annak forráskódját. Írjuk be egy változóba $ strés azzal jelenítse meg var_dump:

Kérjük, vegye figyelembe, hogy var_dump helyesen kell konfigurálni a PHP konfigurációjában (lásd erről az előző oktatóanyagot). Helyes - ez azt jelenti, hogy látnia kell a címkéket, és nem szabad korlátozni a sor hosszát (a webhely oldalának kódja nagyon nagy lehet, és kívánatos mindet látni).

Tehát, ha minden jól sikerült, és látja a webhely oldal forráskódját, itt az ideje, hogy elkezdje elemezni azt reguláris kifejezések.

Ha nem ismeri a reguláris kifejezéseket, vagy kétségei vannak a tudásával kapcsolatban, itt az ideje, hogy tanulmányozza a reguláris kifejezések oktatóanyagát, majd térjen vissza az elemzéssel foglalkozó oktatóanyag tanulmányozásához.

Engedélyezni kell az allow_url_fopen irányelvet: http://php.net/manual/ru/filesystem.configuration.php#ini.allow-url-fopen

Rendszeres kifejezésekkel elemezve

Néhány buktató vár rád, amikor a HTML-kódot reguláris kifejezésekkel próbálod elemezni. Jelenlétük leggyakrabban annak köszönhető, hogy a reguláris kifejezéseket nem a címkék elemzésére szánják - ehhez vannak fejlettebb eszközök, például a phpQuery könyvtár, amelyet a következő órákban elemzünk.

Tudja azonban használni rendszeres kifejezések az elemzéshez szintén fontos - egyrészt, a regexek egyszerűek (ha már ismeritek őket, akkor egyszerűek) és népszerű elemzési eszköz, másrészt a regexek nagyságrenddel gyorsabban működnek, mint bármelyik könyvtár (ez gyakran kritikus), nos, harmadszor, még speciális könyvtárak használata esetén is szükség van szabályos sorokra.

Víz alatti sziklák

Az első meglepetés, amely a használat során vár rád preg_matchés preg_match_all- ez az, hogy csak olyan címkéknél működnek, amelyek teljes egészében egy sorban vannak (vagyis nincs nyomva az enter). Ha többsoros címkét próbál meg elemezni, akkor nem sikerül, amíg nem veszi fel egysoros mód a módosító segítségével s... Ily módon:

A második meglepetés vár rád, amikor megpróbálsz dolgozni a cirill betűkkel - ebben az esetben emlékezned kell arra, hogy módosítót írj u(u kicsi, nem keverhető össze a nagyokkal), így:

Milyen más buktatók várnak rád - a lecke alatt fokozatosan szétszereljük.

Próbáljuk meg elemezni a címkéket

Engedjünk valamilyen módon (például keresztül file_get_contents) megkapta a webhely HTML kódját. Itt van:

Ez a cím címe Ez az oldal fő tartalma.

Vessünk egy pillantást rá. Először kapjuk meg a címke tartalmát , tag <head>, és a címkét <body>.</p> <p>Tehát megkapjuk a címke tartalmát <title>(változóban <b>$ str</b> az elemzett HTML kód tárolva van):</p> <p> <?php preg_match_all("#<title>(.+?)#su ", $ str, $ res); var_dump ($ res);?>

Tartalom :

(.+?)#su ", $ str, $ res); var_dump ($ res);?>

Tartalom :

(.+?)

#su ", $ str, $ res); var_dump ($ res);?>

Általában nincs semmi bonyolult, csak vegye figyelembe, hogy a címkék sarkát és a záró címke perjelét sem kell kitérni (ez utóbbi igaz, ha a regex elválasztó nem perjel /, de például hash #, mint most).

A valóságban azonban törzsvendégeink nem tökéletesek. Bizonyos feltételek mellett ők csak megtagadja a munkát... Erre fel kell készülnie - a feltéveszteni kívánt webhelyek különböznek egymástól (gyakran elavultak is), és ami az egyik webhelyen jól működik, az feltehetőleg abbahagyja a másikon való munkát.

Mi a baj velünk? Valójában a címke - ugyanaz a címke, mint a többi, és tartalmazhat attribútumokat. Leggyakrabban ez az class attribútum, de lehetnek mások is (például Feltöltés alatt a JavaScript futtatásához).

Írjuk át a regexet az attribútumok figyelembevételével:

(.+?)

#su ", $ str, $ res); var_dump ($ res);?>

De itt is tévedtünk, és több hiba is van. Az első- nem lehet plusz + , és egy csillag * , mivel a plusz a jelenlétet jelenti legalább egy karakter- de előfordulhat, hogy a címkében nincsenek attribútumok - és ebben az esetben a címke neve között testés nem lesznek szimbólumok a sarokban - és az alapszakaszunk elmúlik (nem világos, hogy mit írtam ide - tanulja meg az alapszabályokat).

Javítsuk ki ezt a problémát, és térjünk vissza a további vitára:

(.+?)

#su ", $ str, $ res); var_dump ($ res);?>

A második a probléma a következő: ha bent van lesznek más címkék (és így lesz a való életben is) - akkor a rendszeres menetrendünk akasztani fogja a feleslegeset. Fontolja meg például az alábbi kódot:

Ez a cím címe

Rendszeresség nem fogja megtalálni a várakozásoknak megfelelően, és

Bekezdés(

) - mert nem korlátoztuk a kapzsiságát. Csináljuk: hely ír - ebben az esetben minden rendben lesz.

De egy jobb megoldás az lenne, ha pont helyett írnánk a konstrukciót [^>] (nem takaró sarok), mint ez - ] *?> - ebben az esetben teljes mértékben bebiztosítjuk magunkat az ilyen jellegű problémák ellen, mivel az alapszakasz soha nem lesz képes túllépni a címkén.

Blokk megszerzése id alapján

Vessünk egy pillantást a következő kódra:

Ez a cím címe

Tartalom
Egy másik div


Írjunk egy szabályos mintát, amely megkapja egy blokk tartalmát, azonos azonosítóval tartalom.

Tehát próbálkozzon az első számú (nem teljesen helyes):

#(.+?)

#su

Mi van itt? A szóközökkel kapcsolatos probléma - végül is annyi szóköz lehet, amennyit csak akar, a címke neve és az attribútum között, csakúgy, mint az attribútumok körül egyenlő.

Minden ilyen jellegű probléma jelentős - még akkor is, ha az alapszakasza elemzi a webhely egyik oldalát - ez nem azt jelenti, hogy elemez egy másik hasonló oldalt: szóköz lehet körülötte az id attribútumban -, majd az alapszakasza meghiúsul .

Ebből kifolyólag, az értelmező törzsvendégeket úgy kell felépíteni, hogy a lehető legtöbb problémát elkerüljék- ebben az esetben az elemző a lehető legpontosabban fog működni a webhely minden oldalán, és nem csak az Ön által ellenőrzötteken.

Javítsuk ki a rendszeres menetrendünket:

#

(.+?)
#su

Ne feledje, hogy az egyenlőek körül lehet vagy nincs szóköz, ezért van egy csillag ismétlés operátor * .

Ezen felül előfordulhat, hogy nem lehet szóköz a címke záró sarka előtt - vegyük ezt figyelembe:

#(.+?)

#su

Tehát, már jobb, de még mindig messze van az ideáltól - végül is más attribútumok lehetnek az id attribútum körül, például:

... Ebben az esetben az alapszakaszunk elmúlik. Rámutatunk arra, hogy lehetnek más attribútumok is:

#

(.+?)
#su

Felhívjuk figyelmét, hogy utána

érdemes egy rendes .+? és előtte > érdemes egy rendes .*? - ez nem hiba, és szándékában állt, mert utána
szóköznek kell lennie (vagyis legalább egy karakter biztosan lesz), és előtte > lehet, hogy egyáltalán nincsenek egyéb attribútumok (kivéve az azonosítónkat), és nincs is szóköz.

A szabályosság még jobb lett, de van egy probléma: jobb, ha nem használunk pontot olyan blokkokban, mint .*? - eléggé megragadhatjuk a felesleget a címkénk elhagyásával (emlékszel a fenti példára a testtel?). Még jobb használni [^>] a biztonság garanciája:

#

] +? id \ s *? = \ s *? "tartalom" [^>] *? > (. +?)
#su

A következő probléma: az idézőjelek az attribútumokban lehetnek egyszeresek vagy kettősek (lehet, hogy egyáltalán nem is léteznek, ha az attribútum értéke egy szó, de ez az eset ritka - nem vesszük figyelembe, ha találkozik ilyen site - könnyebb szabályos kifejezést írni, főleg neki). Tehát vegyük ezt figyelembe:

#] +? id \ s *? = \ s *? ["\"] tartalom ["\"] [^>] *?> (. +?)

#su

Felhívjuk figyelmét, hogy az egyetlen idézet elkerülve van - ezt megtesszük, mivel a PHP karakterlánc külső idézetei is egyszeresek, itt:

Általában a regex elég jó, de néha tovább mennek, és a címkéből az első idézet megegyezik a másodikkal (kizárva az id = "content" opciót). Ebben az esetben tegye meg - az első idézet a zsebbe kerül, a második idézetet pedig a zseb jelzi, hogy megfeleljen az elsőnek:

#] +? id \ s *? = \ s *? (["\"]) tartalom \ 1 [^>] *?> (. +?)

#su

Feladatunkhoz erre nincs különösebben szükség (biztos lehet benne, mi az id = "tartalom" - valószínűtlen, hogy valahol legyen), de vannak olyan attribútumok, ahol ez alapvető. Például ebben az esetben:

- a title attribútum tartalmazhat egyetlen idézetet és egy regexet cím \ s *? = \ s *? ["\"] (. +?) ["\"] húzza a szöveget " Történet d-ről"- mert a keresés az első idézetig tart.

És itt van a rendszeres cím \ s *? = \ s *? (["\"]) (. +?) \ 1 helyesen fogja kezelni

sőt még
.

A beágyazott blokkprobléma

Van egy másik probléma az alapszakaszunkban - ez nem működik beágyazott blokkokkal. Például, ha van egy másik div a #content div belsejében, a reguláris az első záró előtt megtalálja a szöveget

, nem a #content záró div-jéhez. Példa problémás kódra:

Ez a cím címe

Div belül tartalom
Tartalom


Az alapszakaszunk csak

Div belül tartalom
- az elsőnél megáll
... Mi a teendő ebben az esetben?

Mi a teendő ebben az esetben? Először is, mindig fel kell készülnie erre az esetre - még akkor is, ha nincsenek beágyazott blokkok a webhely vizsgált oldalain - előfordulhat, hogy más oldalakon is szerepelnek, vagy később megjelennek (ha a webhelyet nem egyszer, hanem időszakosan elemzik).

Nos, mit tegyél - csak ragaszkodnod kell ahhoz, hogy ne

, hanem arra, ami a blokkunk alatt van (esetünkben a tartalom alatt). Az alábbi kódban alatta van