html-siltide php puhastamine. PHP: kuidas eemaldada tekstist HTML-silte? Teksti täielik puhastamine html-märgenditest

Sissetulevate andmete valideerimine ja töötlemine on üks levinumaid programmeerimisülesandeid. PHP-keelt kasutatakse tavaliselt veebirakenduste jaoks, seega on siinkohal kõige olulisem eemaldada tekstist HTML-i sildid, sest need on kõige vastuvõtlikumad kolmandate osapoolte süstidele. Selles artiklis tahan teile meelde tuletada vanamehe stip_tags() ja selle funktsioone, samuti pakkuda lahendusi sektsiooniliste HTML-märgendite eemaldamiseks ja veel paar kasulikku boonust.

Niisiis. Meie peamine tööriist HTML-märgendite tekstist eemaldamiseks on funktsioon strip_tags(). Me ütleme talle string väärtus ja see eemaldab sellest HTML- ja PHP-sildid, näiteks:

$s = "

Lõik.

Rohkem teksti.";
echo strip_tags($s);

See näide väljastab rea:

Lõik. Rohkem teksti.

Siinkohal on tähelepanuväärne, et funktsioonil on ka teine ​​(valikuline, kuid kasulik) parameeter, mille väärtus on string lubatud HTML-märgendite loendiga, näiteks:

$s = "

Lõik.

Rohkem teksti.";
echo strip_tags($s, "

See näide väljastab rea:

Lõik.

Rohkem teksti.

Minu arvates on see väga mugav. See aga ei lahenda üht olulist probleemi – sektsiooniliste HTML-märgendite eemaldamine, näiteks: script, noscript ja style – need on kõige levinumad. Millal pean sellised jaotise sildid ja valikud, mis algavad tähega "< » и заканчивающиеся символом « >", kasutan järgmist PHP-koodi:

$p = array(
""]*?>.*?"si",
""]*?>.*?"si",
""]*?>.*?"si",
""si",
);
$r = array(" "," "," "," ");
$s = preg_replace($p, $r, $s);

Siin sisaldab muutuja $p regulaaravaldiste massiivi ja $r on nende vastavate asenduste massiiv (kasutan tühikuid). Jääb vaid reas asendus teha ja me eemaldame tekstist HTML-prügi.

Ilmselgelt saab kahte ülaltoodud lahendust kombineerida. Alguses kasutan asendust regulaaravaldiste kaudu ja seejärel strip_tags() ja saan oma funktsiooni nohtml().

Lõpetuseks tahan teile pakkuda veel mõned kasulikud lahendused. Nii et tekstis on parem asendada vahekaart tühikuga, mõlema tõlgendamise tulemus on brauseris identne ja sellega on vähem probleeme, näiteks:

$s = str_replace("\t", " ", $s);

Kui reavahetusi pole vaja, võib need asendada ka tühikutega, näiteks:

$s = str_replace(massiivi("\n", "\r"), " ", $s);

Lisatühikutest saate vabaneda lihtsa regulaaravaldise abil, näiteks:

$s = preg_replace("/\s+/", " ", $s);
$s = trimmi($s); // poleks viga

See on kõik, mis mul on. Tänan tähelepanu eest. Edu!

kell 21:56 Redigeeri sõnumit

Absoluutselt igaüks seisab silmitsi ülesandega puhastada HTML tarbetutest siltidest.

Esimene asi, mis meelde tuleb, on kasutada strip_tags() php funktsiooni:
string strip_tags (string str [, string lubatud_sildid])

Funktsioon tagastab siltideta stringi. Sildid, mida ei pea eemaldama, edastatakse argumendina allowable_tags. Funktsioon töötab, kuid pehmelt öeldes pole see ideaalne. Teel ei kontrollita koodi kehtivust, mis võib tähendada teksti kustutamist, mis ei sisaldu siltides.
Ennetavad arendajad ei istunud käed rüpes – täiustatud funktsioone võib leida veebist. Hea näide on strip_tags_smart.

Valmislahenduste kasutamine või mittekasutamine on programmeerija isiklik valik. Juhtub nii, et enamasti ei vaja ma “universaalset” töötlejat ja mugavam on koodi puhastada regulaaravaldiste abil.

Mis määrab ühe või teise töötlemisviisi valiku?

1. Allikmaterjalist ja selle analüüsi keerukusest.
Kui teil on vaja töödelda üsna lihtsaid htmp tekste, ilma uhke paigutuseta, selge kui päev :), siis saate kasutada standardseid funktsioone.
Kui tekstidel on teatud tunnused, millega tuleb arvestada, siis kirjutatakse spetsiaalsed käsitlejad. Mõned võivad lihtsalt kasutada str_replace'i. Näiteks:

$s = array("’" => "’", // Parempoolne apostroof (nt I"m-s)
"“" => """, // Avakõne märk
"–" => "—", // Pikk kriips
"â€" => """, // Sulekõne märk
"Ã " => "é", // e terav aktsent
chr(226) . chr(128) . chr(153) => "’", // Jälle parem apostroof
chr(226) . chr(128) . chr(147) => "—", // Jälle pikk kriips
chr(226) . chr(128) . chr(156) => """, // Avakõne märk
chr(226) . chr(128) . chr(148) => "—", // M kriips uuesti
chr(226) . chr(128) => "", // Parema kõne märk
chr(195) . chr(169) => "é", // e jälle äge
);

foreach ($s kui $nõel => $asenda)
{
$htmlTekst = str_asendamine($nõel, $asenda, $htmlTekst);
}

Teised võivad põhineda regulaaravaldistel. Näiteks:

Funktsioon getTextFromHTML($htmlText)
{
$search = array (""]*?>.*?"si", // Eemalda JavaScript
""]*?>.*?"si", // Eemalda stiilid
""]*?>.*?"si", // Eemaldage xml-sildid
""si", // Eemaldage HTML-sildid
""([\r\n])[\s] "", // Eemalda tühikud
""&(quot|#34);"i", // Asenda HTML-i erimärgid
""&(amp|#38);"i",
""&(lt|#60);"i",
""&(gt|#62);"i",
""&(nbsp|#160);"i",
""&(iexcl|#161);"i",
""&(cent|#162);"i",
""&(nael|#163);"i",
""&(koopia|#169);"i",
""(\d);"e"); // kirjuta php-na

$asendamine = array("",
"",
"",
"",
"\\1",
"\"",
"&",
"",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");

Return preg_replace($otsing, $asenda, $htmlTekst);
}
(Sellistel hetkedel on preg_replace'i võimalus töötada massiivide kui parameetritega meeldivam kui kunagi varem). Vajadusel täiendate massiivi oma tavalistega. Näiteks võib see regulaaravaldise konstruktor teid aidata nende koostamisel. Algajatele arendajatele võib artikkel "Kõik HTML-i siltide kohta. 9 regulaaravaldist HTML-i siltide eemaldamiseks" kasulikuks osutuda. Vaata sealseid näiteid, analüüsi loogikat.

2. Köidetest.
Mahud on otseselt seotud analüüsi keerukusega (eelmisest lõigust). Suur hulk tekste suurendab tõenäosust, et kui proovite kõike korrapäraselt planeerida ja koristada, võite millestki ilma jääda. Sel juhul sobib "mitmeetapiline" puhastusmeetod. See tähendab, et puhastage see kõigepealt näiteks funktsiooniga strip_tags_smart (lähtekoodi me igaks juhuks ei kustuta). Seejärel vaatame valikuliselt läbi teatud arvu tekste, et tuvastada "anomaaliaid". Noh, me "puhastame" anomaaliaid tavaliste reeglitega.

3. Millest tuleks selle tulemusena saada.
Töötlemisalgoritmi saab olenevalt olukorrast erinevatel viisidel lihtsustada. Juhtum, mida ma ühes oma eelmises artiklis kirjeldasin, näitab seda hästi. Tuletan meelde, et sealne tekst oli div-is, milles lisaks sellele oli ka “leivapurudega” div, Adsense’i reklaam ja sarnaste artiklite nimekiri. Artiklite näidist analüüsides avastati, et artiklid ei sisaldanud pilte ja need jaotati lihtsalt lõikudeks kasutades . Selleks, et mitte puhastada “peamist” div kõrvalistest asjadest, võite leida kõik lõigud (Simple HTML DOM Parseriga on see väga lihtne) ja ühendada nende sisu. Nii et enne tavapäraste koristusrutiinide tegemist uurige, kas saate vähese verega hakkama.

Üldiselt lahvatavad Internetis tõelised tulevahetused puhtalt regulaaravaldistel põhineva HTML-koodi sõelumise ja dokumendi DOM-struktuuri analüüsil põhineva sõelumise pooldajate vahel. Näiteks ülevoolul. Esmapilgul süütu

Ülesanne eemaldada stringist kõik või ainult teatud html-märgised kerkib sageli esile seal, kus on vaja anda igale lehe külastajale võimalus lisada uut infot. Kõige tavalisem näide on külalisteraamat või kommentaaride süsteem veebisaidil. Sel viisil lisatud tekst võib sisaldada palju erinevaid silte, mis on lisatud kogemata teksti kopeerimisel või tahtlikult, et muuta sõnum kuidagi “väga originaalseks”. Tähelepanu väärivad ka pahatahtlikud katsed skriptimärgendite kaudu saidile pahatahtlikku koodi sisestada või katset rikkuda lehepaigutust tarbetute siltidega.

Kõigil ülaltoodud juhtudel tuleb see enne uue teabe salvestamist tarbetutest html-märgenditest puhastada.

Teksti täielik puhastamine html-märgenditest

Selliste ülesannete jaoks kasutatakse sageli regulaaravaldisi, kuid selles artiklis vaatleme kõige lihtsamat meetodit - siltide eemaldamist PHP funktsiooni strip_tags abil. See funktsioon lihtsalt eemaldab sildid parameetris määratud stringist.

$str_in = "

Minu tekst alates mitmesugused sildid.

" ;
$str_out = riba_sildid($sisenemine);
kaja $str_out;

Selle töötlemise tulemusena saame muutujas $str_out ilma siltideta stringi:

Minu tekst erinevate siltidega.

* Väärib märkimist, et strip_tags funktsioon eemaldab ainult sildid ise, jättes nende sisu avamise ja sulgemise siltide vahele.

Üksikute html-märgendite eemaldamine tekstist

Mõnikord peate stringist eemaldama ainult teatud sildid. Siin kasutame ka funktsiooni strip_tags, kuid seekord määrame teise (valikulise) parameetrina sildid, mis tuleb salvestada.

Näiteks stringi töötlemisel peate jätma ainult lingid:

$str_in = "

Minu tekst alates mitmesugused sildid.

" ;
$str_out = strip_tags($str_in, " " );
kaja $str_out;

Selle töötlemise tulemusena muutujas $str_out saame:

Minu tekst erinevate siltidega.

Nii saab määrata kõik stringis kehtivad sildid, samal ajal kui kõik teised eemaldatakse.


Selles artiklis käsitletakse lihtsaimat viisi märgendite jada tühjendamiseks. Kuna ma kaalun muid võimalusi, laiendan seda artiklit. Mul oleks hea meel, kui pakute oma võimalusi selle probleemi lahendamiseks kommentaarides või meili teel.

JavaScript on teie brauseris blokeeritud. Saidi toimimiseks lubage JavaScript!

riba_sildid

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

strip_tags – eemaldab stringilt HTML- ja PHP-sildid Kirjeldusstring strip_tags (string str [, string lubatud_sildid])

See funktsioon tagastab stringi str koos eemaldatud HTML- ja PHP-märgenditega. Siltide eemaldamiseks kasutatakse automaati, mis sarnaneb funktsioonis fgetss() kasutatavaga.

Valikulist teist argumenti saab kasutada siltide määramiseks, mida ei tohiks eemaldada.

Märkus. Argument enableable_tags lisati PHP 3.0.13 ja PHP 4.0b3 jaoks. Alates PHP 4.3.0-st eemaldatakse ka HTML-i kommentaarid.

Tähelepanu

Kuna strip_tags() ei kontrolli HTML-koodi õigsust, võivad mittetäielikud sildid viia selle teksti eemaldamiseni, mis siltide hulka ei kuulu.

Näide 1. Näide strip_tags() kasutamisest $text = "

Lõik.

Natuke rohkem teksti"; echo strip_tags($text); kaja "\n\n-------\n"; // ära kustuta

Echo strip_tags($tekst, "

"); // Lubama ,, echo strip_tags($text, " ");

See näide väljastab:

Lõik. Veel natuke teksti -------

Lõik.

Veel natuke teksti

Tähelepanu

See funktsioon ei muuda argumendis allowable_tags määratud siltide atribuute, sealhulgas stiili ja onmouseover.

PHP 5.0.0 seisuga on strip_tags() andmete binaarvormingus töötlemiseks ohutu.

Sellel funktsioonil on märkimisväärne puudus - see liimib siltide eemaldamisel sõnad kokku. Lisaks on funktsioonil turvaauke. Alternatiivne funktsioon, mis sarnaneb funktsiooniga strip_tags:

Vaata ka funktsiooni kirjeldust