internetul Windows. Android

Curățarea textului de la etichete HTML inutile - Parsing de la A la Z. Înlăturarea de la etichetele HTML ROM în PHP PHP Scoateți etichetele HTML de la linie

Cu sarcina de a curăța HTML din etichete inutile, este absolut totul cu care se confruntă.

Primul lucru care vine în minte este de a utiliza PHP-Function Strip_TAGS ():
String strips_tags (str șir str (, șir indeagle_tags])

Funcția returnează un șir curățat de la etichete. Etichetele care nu trebuie șterse sunt trecute ca argument permisibil_tags. Funcția funcționează, dar, pentru ao pune ușor, este imperfectă. În curs, nu există nici o verificare a valabilității codului, care poate implica eliminarea textului care nu este inclusă în etichete.
Dezvoltatorii inițiativei nu au satisfăcut mâinile - în rețea puteți găsi funcții modificate. Un exemplu bun este strip_tags_smart.

Aplicați sau nu pentru a aplica soluții gata făcute - o selecție personală a unui programator. Sa întâmplat că, cel mai adesea, nu necesită un handler "universal" și este mai convenabil să curățați codul în mod regulat.

Ce depinde selecția uneia sau a unei alte metode de procesare?

1. Din materialul sursă și complexitatea analizei sale.
Dacă aveți nevoie să gestionați suficiente texte HTMP simplu, fără nici un aspect complicat, clar ca zi :), puteți utiliza funcții standard.
Dacă există anumite caracteristici în textele care trebuie luate în considerare, atunci sunt scrise manipulatori speciali. Puteți fi folosit pur și simplu în unele str_replace. De exemplu:

$ s \u003d matrice ("â € ™" \u003d\u003e "", // dreapta-apostrof (de exemplu, I "M)
"" \u003d\u003e "", // deschiderea marcajului de vorbire
"-" \u003d\u003e "-", // Dash Long
"â €" \u003d\u003e ", // închiderea marcajului de vorbire
"Ã" \u003d\u003e "é", // e accent acut
CHR (226). CHR (128). Chr (153) \u003d\u003e ", // dreapta-apostrof din nou
CHR (226). CHR (128). CHR (147) \u003d\u003e "-", // Long Dash din nou
CHR (226). CHR (128). CHR (156) \u003d\u003e "" ", // deschiderea mărcii de vorbire
CHR (226). CHR (128). CHR (148) \u003d\u003e "-", // m Dash din nou
CHR (226). Chr (128) \u003d\u003e "" ", // marca de vorbire corectă
Chr (195). Chr (169) \u003d\u003e "é", // e acută din nou
);

foreach ($ s ca $ ac \u003d\u003e $ înlocu)
{
$ Htmltext \u003d str_replace ($ ac, $ înlocui, $ htmltext);
}

Altele pot fi bazate pe expresii obisnuite. Ca exemplu:

Funcție gettextfromhtml ($ htmltext)
{
$ Căutare \u003d Array (""]*?>.*?"Si", // eliminați JavaScript
""]*?>.*?"Si", // eliminați stilurile
""]*?>.*?"Si", // eliminați etichetele XML
""<[\/\!]*?[^<>] *?\u003e "Si", // eliminați etichetele HTML
"([\\ r \\ n]) [\\ s]", // eliminați spațiile
"" & (2. # 34); "I", // Înlocuiți caracterele speciale HTML
"" & (AMP | # 38); "I",
"" & (LT | # 60); "I",
"" & GT | # 62); "I",
"& Nbsp | # 160);" I ",
"" & IEXCL | # 161); "I",
"" & (Cent | # 162); "I",
"" & (Pound | # 163); "I",
"" & (Copie | # 169); "I",
"" (\\ d); "e"); // scrieți ca PHP

$ înlocui \u003d matrice (",
"",
"",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
CHR (161),
CHR (162),
CHR (163),
CHR (169),
"CHR (\\\\ 1)");

Return preg_replace (căutare $, $ înlocui, $ htmltext);
}
(La astfel de minute, totuși, posibilitatea de preg_replace va fi fericită să lucreze cu matrice ca parametri). O matrice, dacă este necesar, completează regularitățile obișnuite. Aceasta vă poate ajuta în compilația lor, de exemplu, acest designer de expresii regulate. Dezvoltatorii începători pot fi un articol util "Totul despre etichetele HTML. 9 Express regulat pentru a stripa etichetele HTML". Uită-te acolo exemple, analizați logica.

2. Din volume.
Volumele sunt direct legate de complexitatea analizei (din paragraful anterior). Un număr mare de texte crește probabilitatea ca, încercând să se prevadă și să curețe totul în mod regulat, puteți pierde ceva. În acest caz, metoda de curățare "Multistage" este potrivită. Aceasta este, mai întâi, să spunem, funcția Strip_tags_Smart (codul sursă doar în cazul în care nu ștergeți). Apoi, vizualizați selectiv câteva texte privind identificarea "anomaliei". Ei bine, "Curățați" anomalia cu regulile regulate.

3. Din ceea ce trebuie obținut ca rezultat.
Algoritmul de procesare poate fi simplificat în moduri diferite, în funcție de situație. Cazul descris de mine într-unul din articolele anterioare este bine demonstrat. Permiteți-mi să vă reamintesc că textul era în Divo - E, în care era încă o div cu "Pâine de pâine", publicitatea AdSens, o listă de articole similare. Atunci când se analizează selecția articolelor, sa constatat că articolele nu conțin modele și pur și simplu rupte în paragrafe. Pentru a nu curăța divizia "principală" de la outsideri, puteți găsi toate paragrafele (cu simple HTML Dom parser este foarte simplă) și conectați conținutul acestora. Deci, înainte de a elabora curățenie regulată, uite, este imposibil de a face cu sânge scăzut.

În general, între suporterii parsare a codului HTML, pe baza expresiilor regulate, și parsarea, care se bazează pe analiza structurii DOM a documentului, Holivarurile reale au aprins rețeaua. Aici, de exemplu, pe Overflola. Nevinovat

Verificarea și prelucrarea datelor primite este una dintre sarcinile comune în programare. Limba PHP este de obicei utilizată pentru aplicații web, deci aici este cea mai relevantă eliminare a etichetelor HTML din text, deoarece acestea sunt cele mai susceptibile la injecții terțe. În acest articol, vreau să vă reamintesc de Stip_TAGS () și de jetoanele sale vechi și să ofere, de asemenea, soluții pentru a elimina etichetele HTML secționale și câteva bonusuri utile în același timp.

Asa de. Instrumentul principal de ștergere a etichetelor HTML din text este funcția Strip_TAGS (). Trimitem-o şir Valoare și elimină etichetele HTML și PHP de la acesta, de exemplu:

$ s \u003d "

Paragraf.

Încă text. ";
echo strip_tags ($ s);

Acest exemplu va afișa șirul:

Paragraf. Încă text.

Este demn de remarcat aici că funcția are a doua (opțional, dar util) Parametrul, a căror valoare este un șir cu o listă de etichete HTML permise, de exemplu:

$ s \u003d "

Paragraf.

Încă text. ";
Echo Strip_TAGS ($ S ",

Acest exemplu va afișa șirul:

Paragraf.

Încă text.

În opinia mea, foarte confortabil. Cu toate acestea, nu rezolvă o problemă importantă - Ștergerea etichetelor HTML în secțiuneDe exemplu: script, noscript și stil - sunt cele mai frecvente. Când am nevoie pentru a elimina astfel de etichete de secțiune, precum și opțiuni începând cu "< » и заканчивающиеся символом « > "Folosesc următorul cod PHP:

$ p \u003d matrice (
""]*?>.*?"Si",
""]*?>.*?"Si",
""]*?>.*?"Si",
""<[\/\!]*?[^<>] *?\u003e "Si",
);
$ R \u003d matrice ("", ",", "," ");
$ s \u003d preg_replace ($ p, $ r, $ s);

Aici variabila $ P conține o serie de expresii regulate, iar $ R este o gamă de înlocuire a acestora (Eu folosesc lacune). Rămâne doar să înlocuiți în șir și vom elimina gunoiul HTML din text.

Evident, cele două decizii de mai sus pot fi combinate. La început, folosesc un înlocuitor prin expresii regulate și apoi strip_tags () și primesc propria mea funcție nohtml ().

În cele din urmă, vreau să vă ofer câteva soluții mai utile. Deci, în text este mai bine să înlocuiți fila, rezultatul interpretării celuilalt în browser este identic, iar problema va fi mai mică, de exemplu:

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

Dacă nu aveți nevoie de transferuri de șir, acestea pot fi, de asemenea, înlocuite cu spații, de exemplu:

$ s \u003d str_replace (matrice ("\\ n", "\\ r"), ",, $ s);

Din spațiile suplimentare puteți scăpa de o simplă expresie regulată, de exemplu:

$ s \u003d preg_replace ("/ \\ s + /", "", $ s);
$ s \u003d ornamente ($ s); // nu va fi inutil

Am totul pe asta. Multumesc pentru atentie. Noroc!

la 21:56. Editați mesajul

Aveți un JavaScript blocat în browser-ul dvs. Permiteți JavaScript să lucreze site-ul!

strip_tags.

(PHP 3\u003e \u003d 3,0,8, PHP 4, PHP 5)

strip_tags. - Șterge etichetele HTML și PHP de la linie

Descriere

Şir strip_tags. (Str cu string [, șir admisibile_tags])

Această caracteristică returnează șirul de STR, din care sunt eliminate etichetele HTML și PHP. Pentru a elimina etichetele, un automat este utilizat similar cu funcția aplicată funcției. fgetss ().

Al doilea argument opțional poate fi utilizat pentru a indica etichetele care nu ar trebui șterse.

Cometariu: Argumentul a fost adăugat la PHP 3.0.13 și PHP 4.0b3. Comentariile HTML sunt, de asemenea, șterse de la PHP 4.3.0.

Atenţie

La fel de strip_tags () Nu verifică corectitudinea codului HTML, etichetele neterminate pot duce la îndepărtarea textului care nu este inclusă în etichete.

Exemplu 1. Exemplu de utilizare strip_tags ()
$ Text \u003d "

Paragraf.

Un pic mai mic "; Echo Strip_TAGS ($ text); Echo" \\ n \\ n ------- \\ n "; // nu șterge

Echo strip_tags ($ text "

"); // permiteți ,, Echo strip_tags ($ text " ");

Acest exemplu va scoate la dispoziție:

Paragraf. Un pic mai mult text ----------

Paragraf.

Un pic de text

Atenţie

Această caracteristică nu modifică atributele de etichete specificate în argumentul admisibil_tags, inclusiv stilul și onmouseova.

De la PHP 5.0.0. strip_tags () Asigurați-vă pentru prelucrarea datelor în formă binară.

Această caracteristică are un dezavantaj semnificativ - acesta este un lipire a cuvintelor la eliminarea etichetelor. În plus, funcția are vulnerabilitate. Caracteristică alternativă Analog Strip_TAGS:

C "* - HTML" murdar "este procesat corect, când pot apărea simboluri în valorile atributului etichetei< > * - Procesat corect de HTML * - Cut comentarii, scripturi, stiluri, PHP, Perl, cod ASP, MS Word Taggy, CDATA * - Text Formate automate, dacă conține cod HTML * - Protecție împotriva tipului de fals: "<script\u003e Alertă ("HI")script\u003e * * @param String $ s * @param Array $ admisibile_tags matrice de etichete care nu vor fi tăiate * exemplu: "b" - eticheta va rămâne cu atribute " "- Eticheta va rămâne fără atribute * @param Bool $ is_format_spaces spații de format și transferuri de șir? * Tipul textului de ieșire (simplu) cât mai aproape de text în browser la intrare. * Cu alte cuvinte, convertește competent text / html Text / simplu. * Textul este formatat numai dacă s-au tăiat etichete. * @Param Array $ pair_tags gama de etichete umede, care vor fi șterse împreună cu conținut * Vedeți valorile implicite * @param Array $ para_tags masiv de umed Etichete, care vor fi percepute ca paragrafe (dacă $ is_format_spaces \u003d true) * Vezi valorile implicite * @return string * * @license http://creativecommons.org/licenses/by-SA/3.0/ * @Author Nasibullin Rinat , http: //ogengetie.ru/ * @charset ANSI * @versiune 4.0.14 * / Funcție strip_tags_smart (/ * șir * / $ s, matrice $ admisable_tags \u003d , / * boolean * / $ is_format_spaces \u003d Adevărat, matrice Pereche_tags \u003d array ("script", "stil", "hartă", "iframe", "cadru", "obiect", "Applet", "CO Mment "," buton "," textarea "," selectați "), array $ para_tags \u003d matrice (" p "," td "," th "," Li "," h1 "," h2 "," h3 ", "H4", "H5", "H6", "DIV", "Formular", "Titlu", "Pre") (// retur Strip_TAGS ($ s); Static $ _callback_type \u003d false; static $ _allowable_tags \u003d matrice (); static $ _para_tags \u003d matrice (); # Expresie regională pentru atributele de etichete # Proorificați procesele Dirty și HTML rupte într-un charset UTF-8 cu unsibyte sau multibyte! Static $ re_attrs_fast_safe \u003d "(?!) #Statement, care urmează după o etichetă #Correct atribute (?\u003e [^\u003e \\"] + | (?<=[\=\x20\r\n\t]|\xc2\xa0) "[^"]*" | (?<=[\=\x20\r\n\t]|\xc2\xa0) \"[^\"]*\")* #incorrect attributes [^>] * + "; dacă (IS_Array ($ s)) (dacă ($ s)" ($ _Callback_type \u003d\u003d\u003d "Strip_TAgs") ($ etichetă \u003d strtolower ($ s); dacă ($ _allowable_tags) (#Tag cu atribute dacă (array_key_exists ($ Tag, $ _allowable_tags)) Returnați $ s; #Tag fără atribute dacă (array_key_exists ("<" . $tag . ">", $ _allowable_tags)) (dacă (substr ($ s, 0, 2) \u003d\u003d\u003d""; dacă (substr ($ s, -2) \u003d\u003d\u003d" /\u003e ") return"<" . $tag . " />"; Întoarcere"<" . $tag . ">")) Dacă ($ etichetă \u003d\u003d\u003d" br ") retur" \\ r \\ n "; dacă ($ _para_tags && array_key_exists ($ etichetă, $ _para_tags)) retur" \\ r \\ n \\ r \\ n "; retur "";) TRIGGER_ERROR ("Tipul de apel necunoscut". "$ _Callback_type." "" ", E_USER_ERROR);) dacă (($ POS \u003d STPOS ($ S".<")) === false || strpos($s, ">", $ POS) \u003d\u003d\u003d FALSE) # #Tags nu au fost găsite retur $ s;) $ lungime \u003d strlen ($ s); # Tag-uri cu repaus (deschidere, închidere, spația de nume de nume MS) $ Re_tags \u003d "~: * +)?) # 1 ". $ Re_atts_fast_safe."\u003e ~ Sxsx "; $ modele \u003d matrice (" /<([\?\%]) .*? \\1>/ Sxsx ", # Built-in PHP, Perl, cod ASP" /<\!\\]>/ Sxsx ", # CDATA #" blocuri "/<\!\[ [\x20\r\n\t]* .*? \]>/ Sxsx ", #: Deprecated: Tag-ul MS Word Tagged... "/<\!--.*?-->/ Ssx ", # comentarii #ms tip tagged cuvânt...", # Cod de execuție condiționat pentru tipul de ieșire" HTML "Codul de execuție condiționat pentru tipul IE" HTML."# Vezi http://www.tigir.com/comments.htm" /<\! (?:--)?+ \[ (?> [^] "\\"] + | "[^"] * "\\" [^ \\ "] * \\") * \\] (?: -)? +\u003e / sxsx ",); dacă ($ pereche_tags) (# pereche etichete împreună cu conținut: foreach ($ pair_tags ca $ k \u003d\u003e $ v) $ pereche_tags [$ k] \u003d preg_quote ($ v, "/"); $ patterns \u003d "/<((?i:" . implode("|", $pair_tags) . "))" . $re_attrs_fast_safe . "(? .*? <\/(?i:\\1)" . $re_attrs_fast_safe . "> / Sxsx ";) #d ($ modele); $ i \u003d 0; # protecția împotriva $ max \u003d 99; în timp ce ($ i< $max) { $s2 = preg_replace($patterns, "", $s); if (preg_last_error() !== PREG_NO_ERROR) { $i = 999; break; } if ($i == 0) { $is_html = ($s2 != $s || preg_match($re_tags, $s2)); if (preg_last_error() !== PREG_NO_ERROR) { $i = 999; break; } if ($is_html) { if ($is_format_spaces) { /* В библиотеке PCRE для PHP \s - это любой пробельный символ, а именно класс символов [\x09\x0a\x0c\x0d\x20\xa0] или, по другому, [\t\n\f\r \xa0] Если \s используется с модификатором /u, то \s трактуется как [\x09\x0a\x0c\x0d\x20] Браузер не делает различия между пробельными символами, друг за другом подряд идущие символы воспринимаются как один */ #$s2 = str_replace(array("\r", "\n", "\t"), " ", $s2); #$s2 = strtr($s2, "\x09\x0a\x0c\x0d", " "); $s2 = preg_replace("/ [\x09\x0a\x0c\x0d]++ | <((?i:pre|textarea))" . $re_attrs_fast_safe . "(? .+? <\/(?i:\\1)" . $re_attrs_fast_safe . "> \\ K / sxsx ",", $ s2); dacă (preg_last_error ()! \u003d\u003d preg_no_error) ($ i \u003d 999; pauză;)) o serie de etichete care nu vor fi tăiate dacă ($ admisibile_tags) $ _allowable_tags \u003d array_flip ($ admisibil_tags); # etichete pereche care vor fi percepute ca paragrafe ($ para_tags) $ _para_tags \u003d array_flip ($ para_tags);))))))) s2 \u003d preg_replace_callback ($ re_tags, __function__, $ s2); $ _callback_type \u003d falsă; dacă (preg_last_error ()! \u003d\u003d preg_no_error) ($ i \u003d 999; pauză;))) dacă ($ s \u003d\u003d\u003d $ s2) pauză; $ S \u003d $ s2; $ i ++;) # timp dacă ($ i\u003e \u003d $ max) $ s \u003d strip_tags ($ s); #Too multe cicluri pentru înlocuire ... dacă ($ is_format_spaces && strlen ($ s )! \u003d \u003d $ Lungime) (#Removează spații duplicate $ s \u003d preg_replace ("/ \\ x20 \\ x20 ++ / ssx", ", ornament ($ s)); #Removează un spații înainte și după noi linii $ S \u003d str_replace (matrice (\\ r \\ n \\ x20 "," \\ x20 \\ r \\ n "," \\ r \\ n \\ n \\ n "," \\ r \\ n \\ n \\ n ", $ s); preg_replace ("/ [\\ r \\ n] (3,) + / ssx", \\ ) Returnați $ s; )?\u003e.

Consultați De asemenea, descrierea funcției

Ștergerea sarcinii Toate sau numai anumite etichete HTML de la linie apare adesea acolo unde este necesar să furnizați posibilitatea oricărui vizitator pentru a adăuga informații noi. Cel mai frecvent exemplu poate fi un sistem de comentarii sau un sistem de comentarii pe site. Textul care este astfel adăugat poate conține multe etichete diferite adăugate întâmplător când copiați textul sau în mod deliberat pentru a face un mesaj cumva "foarte original". Este demn de remarcat aceleași încercări și rău intenționate de a face un cod rău intenționat în etichetele scriptului sau o încercare de a strica aspectul paginii cu etichete suplimentare.

În oricare dintre cazurile enumerate, este necesar înainte de a înregistra informații noi, curățați-l de la etichetele HTML inutile.

Curățarea completă a textului de la etichetele HTML

Adesea, expresii regulate sunt folosite pentru astfel de sarcini, dar în acest articol vom lua în considerare cea mai ușoară metodă - ștergerea etichetelor utilizând funcția PHP Strip_TAGS. Această caracteristică șterge pur și simplu etichetele de la șirul specificat în parametru.

$ str_in \u003d. "

Ale mele text din variat Etichete.

" ;
$ str_out \u003d strip_tags ($ str_in);
echo $ str_out;

Ca urmare a acestei prelucrări în variabila $ str_out vom primi un șir fără etichete:

Textul meu cu diferite etichete.

* Este demn de remarcat faptul că funcția Strip_TAGS elimină numai etichetele în sine, lăsând conținutul între eticheta de deschidere și închidere.

Eliminarea etichetelor individuale HTML din text

Uneori trebuie să eliminați numai anumite etichete din șir. Aici vom folosi și funcția Strip_TAGS, dar de data aceasta al doilea parametru (opțional) indică etichetele pe care doriți să le salvați.

De exemplu, atunci când procesați un șir, trebuie să lăsați doar link-uri:

$ str_in \u003d. "

Ale mele text din variat Etichete.

" ;
$ str_out \u003d strip_tags ($ str_in " " );
echo $ str_out;

Ca urmare a acestei prelucrări într-o variabilă $ str_out obținem:

Textul meu cu diferite etichete.

Astfel, puteți specifica toate etichetele care sunt permise în șir, în timp ce oricine altcineva vor fi șterse.


Acest articol discută cel mai simplu mod de a curăța linia de la etichete. Având în vedere alte opțiuni, voi extinde acest articol. Voi fi bucuros dacă vă oferiți soluțiile la această sarcină în comentarii sau prin e-mail.