PHP čistenie HTML tagov. PHP: Ako odstrániť značky HTML z textu? Kompletné čistenie textu z html značiek

Keď prijímate údaje od používateľov, má zmysel spracovať údaje, ktoré sú od nich odoslané, a na výstupe dostať čistý text.

Ako to môžem spraviť rôzne cesty, Teraz ti to poviem.

Ako odstrániť všetky značky HTML z reťazca v PHP?

PHP má funkciu nazývanú „ strip_tags“. Umožňuje vám rýchlo a ľahko odstrániť všetky značky HTML z premennej.

Implementácia:

Ahoj svet!"; $ content = strip_tags ($ content); echo $ content; // Zobrazí sa„ Hello, world! “?>

Ahoj svet!


"; $ content = strip_tags ($ content,"

"); echo $ content; // Vytlačí" Ahoj, svet!

Lorem ipsum dolor sit amet, consectetur adipiscing ellit.
Vivamus sed lacus vel diam consectetur rhoncus et eget justo.

" ?>

V tomto prípade uložíme značky

A ... Pri štítkoch, ktoré majú koncovú značku, ich pri ukladaní nemusíte registrovať.

Poznámka, funkcia nekontroluje platnosť značiek HTML a ak existujú neuzavreté značky, riskujete stratu normálneho textu.

Ako odstrániť všetky značky HTML z reťazca v jazyku JavaScript?

V JavaScripte napíšeme vlastnú malú funkciu, pomocou ktorej následne prijaté údaje spracujeme.

Implementácia:

Tento príklad funguje na konkrétnej danej premennej, ale môžete ho upraviť tak, aby zodpovedal prijatému obsahu, napríklad zo vstupného poľa.

JavaScript je vo vašom prehliadači zablokovaný. Aby stránka fungovala, povoľte JavaScript!

strip_tags

(PHP 3> = 3,0,8, PHP 4, PHP 5)

strip_tags- Odstráni značky HTML a PHP z reťazca

Popis

reťazec strip_tags(string str [, string allowable_tags])

Táto funkcia vráti reťazec str, z ktorého boli značky HTML a PHP odstránené. Na odstránenie štítkov sa používa automat, podobný automatu, ktorý sa používa vo funkcii fgetss () .

Voliteľný druhý argument možno použiť na zadanie značiek, ktoré by sa nemali odstraňovať.

Komentár: Argument allowable_tags bol pridaný v jazykoch PHP 3.0.13 a PHP 4.0b3. Od PHP 4.3.0 sa odstránia aj komentáre HTML.

Pozor

Pretože strip_tags () nekontroluje správnosť kódu HTML, neúplné značky môžu viesť k vymazaniu textu, ktorý nie je súčasťou značiek.

Príklad 1. Príklad použitia strip_tags ()
$ text = "

Odstavec.

Ešte nejaký text "; echo strip_tags ($ text); echo" \ n \ n ------- \ n "; // neodstraňovať

Echo strip_tags ($ text, "

"); // Povoliť ,,echo strip_tags ($ text, " ");

Tento príklad poskytne výstup:

Odstavec. Ešte nejaký text -------

Odstavec.

Ešte nejaký text

Pozor

Táto funkcia nemení atribúty značiek uvedených v argumente allowable_tags vrátane štýlu a onmouseover.

Od PHP 5.0.0 strip_tags () bezpečný na spracovanie údajov v binárnej forme.

Táto funkcia má značnú nevýhodu - je to lepenie slov pri odstraňovaní značiek. Okrem toho má táto funkcia slabé miesta. Alternatívna funkcia analogická s strip_tags:

c "* -" špinavý "html je spracovaný správne, keď je možné nájsť hodnoty v hodnotách atribútu tagu< >* - zlomený html je spracovaný správne * - komentáre, skripty, štýly, PHP, Perl, kód ASP, tagy MS Word, CDATA sú vystrihnuté * - text sa automaticky naformátuje, ak obsahuje html kód * - ochrana proti falzifikátom ako: „<skript> upozornenie („ahoj“) skript> " * * @param reťazec $ s * @param pole $ allowable_tags Pole značiek, ktoré nebudú prerušené * Príklad:" b "- značka zostane s atribútmi," "- značka zostane bez atribútov * @param bool $ is_format_spaces Formátovať medzery a konce riadkov? * Výstupný text (obyčajný) je čo najbližšie k vstupnému textu v prehliadači. * Inými slovami, inteligentne prevádza text / html na text / obyčajný. * Text je formátovaný iba vtedy, ak boli odstránené všetky značky. * @Param pole $ pair_tags pole názvov spárovaných značiek, ktoré sa majú odstrániť spolu s obsahom * pozri predvolené hodnoty * @pole parametra $ para_tags pole názvov spárovaných značiek, s ktorými sa bude zaobchádzať ako s odsekmi (ak $ is_format_spaces = true) * pozri predvolené hodnoty * @return reťazec * * @license http://creativecommons.org/licenses/by-sa/3.0/ * @autor Nasibullin Rinat , http: //orangetie.ru/ * @charset ANSI * @version 4.0.14 * / funkcia strip_tags_smart ( / * reťazec * / $ s, pole $ allowable_tags = null, / * boolean * / $ is_format_spaces = true, pole $ pair_tags = pole („skript“, „štýl“, „mapa“, „iframe“, „sada rámcov“, „objekt“, „aplet“, „čo“ mment "," tlačidlo "," textarea "," vybrať "), pole $ para_tags = pole (" p "," td "," th "," li "," h1 "," h2 "," h3 ", "h4", "h5", "h6", "div", "form", "title", "pre")) (// návrat strip_tags ($ s); static $ _callback_type = false; static $ _allowable_tags = pole (); static $ _para_tags = pole (); #pravidelný výraz pre atribúty značiek #správne spracováva špinavé a poškodené HTML v jednobajtovej alebo viacbytovej znakovej sade UTF-8! static $ re_attrs_fast_safe = "(?!) #statement, ktorý nasleduje za značkou #správne atribúty (?> [^>" \ "] + | (?<=[\=\x20\r\n\t]|\xc2\xa0) "[^"]*" | (?<=[\=\x20\r\n\t]|\xc2\xa0) \"[^\"]*\")* #incorrect attributes [^>] * + "; if (is_array ($ s)) (if ($ _callback_type ===" strip_tags ") ($ tag = strtolower ($ s); if ($ _allowable_tags) (#tag with attributes if (array_key_exists ($ tag, $ _allowable_tags)) vráti $ s; #tag bez atribútov if (array_key_exists ("<" . $tag . ">", $ _allowable_tags)) (if (substr ($ s, 0, 2) ===""; if (substr ($ s, -2) ===" /> ") návrat"<" . $tag . " />"; vrátiť"<" . $tag . ">";)) if ($ tag ===" br ") return" \ r \ n "; if ($ _para_tags && array_key_exists ($ tag, $ _para_tags)) return" \ r \ n \ r \ n "; return "";) trigger_error ("Neznámy typ spätného volania" ". $ _callback_type." "!", E_USER_ERROR);) if (($ pos = strpos ($ s, "<")) === false || strpos($s, ">", $ pos) === nepravda) #rýchlosť zlepšená ( #tagy sa nenašli vrátiť $ s;) $ dĺžka = strlen ($ s); #nespárované značky (otváranie, zatváranie ,! DOCTYPE, priestor názvov MS Word) $ re_tags = "~: * +)?) # 1 ". $ Re_attrs_fast_safe."> ~ SxSX "; $ patterns = pole (" /<([\?\%]) .*? \\1>/ sxSX ", # vstavaný kód PHP, Perl, ASP" /<\!\\]>/ sxSX ", # bloky CDATA #" /<\!\[ [\x20\r\n\t]* .*? \]>/ sxSX ", #: DEPRECATED: Značky MS Word ako... "/<\!--.*?-->/ sSX ", # komentáre #MS Word tagy ako"...", # podmienené spustenie kódu pre typ IE" HTML "# spustenie podmieneného kódu pre typ IE"Html"# pozri http://www.tigir.com/comments.htm"/<\! (?:--)?+ \[ (?>[^ \] "\"] + | "[^"] * "| \" [^ \ "] * \") * \] (?: -)? +> / sxSX ",); if ($ pair_tags) (# spárovaných značiek s obsahom: foreach ( $ pair_tags ako $ k => $ v) $ pair_tags [$ k] = preg_quote ($ v, "/"); $ patterns = "/<((?i:" . implode("|", $pair_tags) . "))" . $re_attrs_fast_safe . "(? .*? <\/(?i:\\1)" . $re_attrs_fast_safe . ">/ sxSX ";) #d ($ vzory); $ i = 0; # ochrana slučky $ max = 99; pričom ($ 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); if (preg_last_error ()! == PREG_NO_ERROR) ($ i = 999; break;)) # rad značiek, ktoré nebudú orezané, ak ($ ​​allowable_tags) $ _allowable_tags = array_flip ($ allowable_tags); #spárované značky, s ktorými sa bude zaobchádzať ako s odsekmi, ak ($ ​​para_tags) $ _para_tags = array_flip ($ para_tags);)) #if #tags spracovanie if ($ is_html) ($ _callback_type = "strip_tags"; $ s2 = preg_replace_callback ($ re_tags, __FUNCTION__, $ s2); $ _callback_type = false; if (preg_last_error ()! == PREG_NO_ERROR) ($ i = 999; break;)) if ($ s === $ s2) break ; $ s = $ s2; $ i ++;) #while if ($ i> = $ max) $ s = strip_tags ($ s); #príliš veľa cyklov na výmenu ... if ($ is_format_spaces && strlen ($ s)! = = $ dĺžka) (#odstrániť duplicitné medzery $ s = preg_replace (" / \ x20 \ x20 ++ / sSX", "", trim ($ s)); #odstrániť medzery pred a za novými riadkami $ s = str_replace (pole ("\ r \ n \ x20", "\ x20 \ r \ n"), "\ r \ n", $ s); #replace 3 and more new lines to 2 new lines $ s = preg_replace (" / [\ r \ n] (3,) + / sSX", "\ r \ n \ r \ n ", $ s); ) vrátiť $ s; )?>

Pozrite si aj popis funkcie

Úloha odstrániť všetky alebo len určité html značky z reťazca často vzniká tam, kde je potrebné poskytnúť každému návštevníkovi stránky príležitosť pridať nové informácie. Najbežnejším príkladom by bola kniha návštev alebo systém komentovania stránok. Takto pridaný text môže obsahovať mnoho rôznych tagov, pridaných omylom pri kopírovaní textu alebo zámerne, aby bola správa akosi „veľmi originálna“. Za zmienku tiež stoja škodlivé pokusy o vloženie škodlivého kódu na web v značkách skriptov alebo pokus o pokazenie rozloženia stránky nepotrebnými značkami.

V ktoromkoľvek z vyššie uvedených prípadov je potrebné pred napísaním nových informácií vymazať nepotrebné html značky.

Kompletné čistenie textu z html značiek

Na tieto úlohy sa často používajú regulárne výrazy, ale v tomto článku sa budeme zaoberať najjednoduchšou metódou - odstraňovaním značiek pomocou funkcie strip_tags php. Táto funkcia jednoducho odstráni značky zo zadaného reťazca.

$ str_in = "

Môj text s rôzne tagy.

" ;
$ str_out = strip_tags ($ str_in);
echo $ str_out;

Výsledkom tohto spracovania je, že v premennej $ str_out dostaneme reťazec bez značiek:

Môj text s rôznymi značkami.

* Všimnite si toho, že funkcia strip_tags odstráni iba samotné značky a ponechá ich obsah medzi úvodnými a záverečnými značkami.

Odstránenie jednotlivých značiek html z textu

Niekedy stačí z reťazca odstrániť iba určité značky. Tu tiež použijeme funkciu strip_tags, ale tentokrát určíme značky, ktoré sa majú uložiť, s druhým (voliteľným) parametrom.

Napríklad pri spracovaní reťazca musíte nechať iba odkazy:

$ str_in = "

Môj text s rôzne tagy.

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

Výsledkom tohto spracovania v premennej $ str_out je:

Môj text s rôznymi značkami.

Môžete teda zadať všetky značky platné v reťazci, zatiaľ čo všetky ostatné budú odstránené.


Tento článok pojednáva o najľahšom spôsobe vymazania značiek z reťazca. Keď zvažujem ďalšie možnosti, rozšírim tento článok. Budem rád, ak mi v komentároch alebo e-mailom navrhnete svoje možnosti riešenia tohto problému.

Absolútne každý stojí pred úlohou vyčistiť html od nepotrebných značiek.

Prvá vec, ktorá vám príde na myseľ, je použiť funkciu php strip_tags ():
string string_tags (string str [, string allowable_tags])

Funkcia vráti reťazec zbavený značiek. Značky, ktoré by sa nemali odstraňovať, sa zadávajú ako argument allowable_tags. Táto funkcia funguje, ale mierne povedané, nie je dokonalá. Cestou sa nekontroluje platnosť kódu, čo môže znamenať odstránenie textu, ktorý nie je súčasťou značiek.
Proaktívni vývojári nezaháľali - vylepšené funkcie nájdete na internete. Strip_tags_smart je dobrým príkladom.

To, či použiť hotové riešenia alebo nie, je na osobnej voľbe programátora. Stalo sa, že najčastejšie nepotrebujem „univerzálny“ obslužný program a je pohodlnejšie vyčistiť kód regulárnymi výrazmi.

Čo určuje výber tejto alebo tej metódy spracovania?

1. Zo zdrojového materiálu a náročnosti jeho analýzy.
Ak potrebujete spracovať pomerne jednoduché htmp texty, bez efektného rozloženia, jasné ako deň :), môžete použiť štandardné funkcie.
Ak majú texty určité zvláštnosti, ktoré je potrebné vziať do úvahy, potom sú tu napísané špeciálne ovládače. Niektorí môžu použiť iba str_replace. Napríklad:

$ s = pole ("â € ™" => "'", // apostrof vpravo (napr. v I "m)
"â € œ" => "" ", // Úvodná rečová značka
"â €" "=>" - ", // Dlhá pomlčka
"â €" => "" ", // Uzatváracia rečová značka
"Ã" => "é", // akútny prízvuk
chr (226). chr (128). chr (153) => "'", // Opäť apostrof
chr (226). chr (128). chr (147) => "-", // Opäť dlhá pomlčka
chr (226). chr (128). chr (156) => "" ", // Úvodná rečová značka
chr (226). chr (128). chr (148) => "-", // M znova pomlčka
chr (226). chr (128) => "" ", // Pravá rečová značka
chr (195). chr (169) => "é", // e opäť akútne
);

foreach ($ s ako $ ihla => $ nahradiť)
{
$ htmlText = str_replace ($ ihla, $ náhrada, $ htmlText);
}

Ostatné môžu byť založené na regulárne výrazy... Ako príklad:

Funkcia getTextFromHTML ($ htmlText)
{
$ search = pole (""]*?>.*?"si", // Odstráňte javaScript
""]*?>.*?"si", // Odstráňte štýly
""]*?>.*?"si", // Odstráňte značky XML
""<[\/\!]*?[^<>] *?> "si", // Odstráňte značky HTML
"" ([\ r \ n]) [\ s] "", // Odstráňte medzery
"" & (quot | # 34); "i", // Nahradenie špeciálnych znakov HTML
"" & (amp | # 38); "i",
"" & (lt | # 60); "i",
"" & (gt | # 62); "i",
"" & (nbsp | # 160); "i",
"" & (iexcl | # 161); "i",
"" & (cent | # 162); "i",
"" & (libra | # 163); "i",
"" & (kópia | # 169); "i",
"" (\ d); "e"); // napíš ako php

$ replace = pole ("",
"",
"",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr (161),
chr (162),
chr (163),
chr (169),
"chr (\\ 1)");

Vrátiť preg_replace ($ search, $ replace, $ htmlText);
}
(V takýchto chvíľach je schopnosť preg_replace pracovať s poľami ako parametrami potešujúca viac ako kedykoľvek predtým). V prípade potreby doplníte pole svojimi štamgastmi. Pri ich zostavovaní vám môže napríklad pomôcť tento konštruktér regexu. Začínajúcim vývojárom môže byť užitočný článok „Všetko o značkách HTML. 9 regulárnych výrazov na odstránenie značiek HTML“. Pozrite sa na tam uvedené príklady, analyzujte logiku.

2. Zo zväzkov.
Zväzky priamo súvisia so zložitosťou analýzy (z predchádzajúceho odseku). Veľký počet textov zvyšuje pravdepodobnosť, že vám niečo chýba, tým, že sa pokúsite všetko predvídať a vyčistiť pomocou štamgastov. V tomto prípade je vhodná metóda „viacstupňového“ čistenia. To znamená, že najskôr vyčistite, povedzme, pomocou funkcie strip_tags_smart (zdroje pre prípad nevymažeme). Potom selektívne zoskenujeme niekoľko textov, aby sme identifikovali „anomálie“. Nuž, „čistíme“ anomálie pravidelnými čiarami.

3. Z toho, čo chcete získať ako výsledok.
Algoritmus spracovania môže byť zjednodušený rôznymi spôsobmi v závislosti od situácie. Prípad, ktorý som popísal v jednom z predchádzajúcich článkov, to dobre ukazuje. Pripomeniem, že text tam bol vo formáte div, v ktorom bol okrem neho aj div s „chlebovými drobkami“, inzerciou na webe Adsense a zoznamom podobných článkov. Pri analýze vzorky článkov sa zistilo, že články neobsahovali obrázky a boli jednoducho rozčlenené na odseky pomocou. Aby ste „hlavný“ div nevyčistili od cudzích vecí, môžete nájsť všetky odseky (s programom Simple HTML DOM Parser je to veľmi jednoduché) a skombinovať ich obsah. Takže skôr, ako si vymyslíte štamgastov na čistenie, zistite, či si vystačíte s trochou krvi.

Vo všeobecnosti medzi zástancami analýzy html kódu založeného výlučne na regulárnych výrazoch a analýzy, ktorá je založená na analýze štruktúry DOM dokumentu, na webe vzplanú skutočné holivary. Napríklad pretečenie. Na prvý pohľad nevinné

Kontrola a spracovanie prichádzajúcich údajov je jednou z bežných úloh programovania. Jazyk PHP sa zvyčajne používa pre webové aplikácie, takže odstránenie tagov HTML z textu je tu najrelevantnejšie, pretože sú najcitlivejšie na injekcie tretích strán. V tomto článku vám chcem pripomenúť staré stip_tags () a jeho triky, ako aj navrhnúť riešenia na odstránenie sekčných značiek HTML a niekoľko užitočných bonusov, ktoré je potrebné nasledovať.

Takže. Našim hlavným nástrojom na odstraňovanie značiek HTML z textu je funkcia strip_tags (). Dávame jej reťazec hodnotu a odstráni z nej značky HTML a PHP, napríklad:

$ s = "

Odstavec.

Viac textu. ";
echo strip_tags ($ s);

Tento príklad vygeneruje riadok:

Odstavec. Viac textu.

Tu je pozoruhodné, že funkcia má aj druhú (voliteľné, ale užitočné) parameter, ktorého hodnota je reťazec so zoznamom povolených značiek HTML, napríklad:

$ s = "

Odstavec.

Viac textu. ";
echo strip_tags ($ s, "

Tento príklad vygeneruje riadok:

Odstavec.

Viac textu.

Podľa mňa je to veľmi výhodné. To však nerieši jeden dôležitý problém - odstránenie sekčných značiek HTML napríklad skript, noscript a štýl sú najbežnejšie. Keď potrebujem odstrániť tieto sekčné značky, ako aj možnosti začínajúce na „< » и заканчивающиеся символом « >", Používam nasledujúci kód PHP:

$ p = pole (
""]*?>.*?"si",
""]*?>.*?"si",
""]*?>.*?"si",
""<[\/\!]*?[^<>] *?> "si",
);
$ r = pole ("", "", "", "");
$ s = preg_replace ($ p, $ r, $ s);

Tu premenná $ p obsahuje pole regulárnych výrazov a $ r je pole ich zodpovedajúcej náhrady (používam medzery)... Jediná vec, ktorú musíte urobiť, je nahradiť riadok a z textu odstránime odpadky HTML.

Vyššie uvedené dve riešenia je samozrejme možné kombinovať. Najprv použijem nahradenie regulárnym výrazom a potom strip_tags () a získam vlastnú funkciu nohtml ().

Na záver by som vám chcel ponúknuť niekoľko užitočnejších riešení. V texte je teda lepšie nahradiť karty medzerou, výsledok interpretácie oboch v prehliadači je identický a problémy budú menšie, napríklad:

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

Ak nepotrebujete zalomenia riadkov, môžu byť tiež nahradené medzerami, napríklad:

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

Prebytočných medzier sa môžete zbaviť jednoducho regulárny výraz, napríklad:

$ s = preg_replace (" / \ s + /", "", $ s);
$ s = trim ($ s); // nebude nadbytočné

To je pre mňa všetko. Ďakujem za pozornosť. Veľa štastia!

o 21:56 Zmeniť správu