Čistenie textu od nepotrebných html tagov – analýza od A do Z. PHP: ako odstrániť HTML tagy z textu? Výnimky značiek PHP strip

  • 20.06.2020

JavaScript je vo vašom prehliadači zablokovaný. Povoľte JavaScript pre túto stránku!

strip_tags

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

strip_tags- Odstráni HTML a PHP tagy z reťazca

Popis

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

Táto funkcia vráti reťazec str s odstránenými značkami HTML a PHP. Na odstránenie značiek sa používa automat podobný tomu, ktorý sa používa vo funkcii fgetss() .

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

komentár: Argument allowable_tags bol pridaný v PHP 3.0.13 a PHP 4.0b3. Od PHP 4.3.0 sú odstránené aj HTML komentáre.

Pozornosť

Ako strip_tags() nekontroluje správnosť HTML kódu, nedokončené tagy môžu viesť k odstráneniu textu, ktorý sa v tagoch ​​nenachádza.

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

Odsek.

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

echo strip_tags($text, "

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

Tento príklad vypíše:

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

Odsek.

Ešte nejaký text

Pozornosť

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

Od PHP 5.0.0 strip_tags() bezpečné manipulovať s údajmi v binárnej forme.

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

c" * - "špinavý" html je správne spracovaný, keď možno v hodnotách atribútov značky nájsť znaky< >* - poškodený html je spracovaný správne * - komentáre, skripty, štýly, PHP, Perl, ASP kód, MS Word tagy, CDATA sú vystrihnuté * - text je automaticky naformátovaný, ak obsahuje html kód * - ochrana proti falzifikátom ako: "<script>alert("ahoj") script>" * * @param string $s * @param pole $allowable_tags Pole tagov, ktoré nebudú odstránené * Príklad: "b" -- tag zostane s atribútmi, " " -- značka zostane bez atribútov * @param bool $is_format_spaces Formátovať medzery a zlomy riadkov? * Výstupný textový vzhľad (obyčajný) čo najbližšie k vzhľadu textu vo vstupe prehliadača. * Inými slovami, správne konvertuje text/html na text/plain. * Text je naformátovaný iba vtedy, ak boli odstránené nejaké značky * @param pole $pair_tags pole názvov párových tagov, ktoré sa majú odstrániť spolu s obsahom * pozri predvolené hodnoty * @param pole $para_tags pole názvov párových značiek, s ktorými sa bude zaobchádzať ako s odsekmi (ak $is_format_spaces = true) * pozri predvolené hodnoty * @return string * * @license http://creativecommons.org/licenses/by-sa/3.0/ * @author Nasibullin Rinat, http: //orangetie.ru/ * @charset ANSI * @verzia 4.0.14 */ funkcia strip_tags_smart(/*string*/ $s, pole $allowable_tags = null, /*boolean*/ $is_format_spaces = true, pole $pair_tags = pole ("script", "style", "map", "iframe", "frameset", "object", "applet", "co mment", "tlačidlo", "textarea", "select"), pole $para_tags = array("p", "td", "th", "li", "h1", "h2", "h3", "h4", "h5", "h6", "div", "form", "title", "pre")) ( //návrat strip_tags($s); statický $_callback_type = false; statické $_allowable_tags = array(); statické $_para_tags = pole(); #regulárny výraz pre atribúty značiek #správne procesy špinavé a nefunkčné HTML v jednobajtovej alebo viacbajtovej znakovej sade UTF-8! static $re_attrs_fast_safe = "(?!) #príkaz, ktorý nasleduje po značke #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 s atribútmi 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) === "/>") return "<" . $tag . " />";návrat"<" . $tag . ">"; ) ) if ($tag === "br") vráti "\r\n"; if ($_para_tags && array_key_exists($tag, $_para_tags)) vráti "\r\n\r\n"; vráti ""; ) trigger_error("Neznámy typ spätného volania "" . $_callback_type . ""!", E_USER_ERROR); ) if (($pos = strpos($s, "<")) === false || strpos($s, ">", $pos) === false) #zlepšenie rýchlosti ( #značky sa nenašli vrátia $s; ) $dĺžka = strlen($s); #nespárované značky (otváranie, zatváranie, !DOCTYPE, menný priestor MS Word) $re_tags = "~:*+)?) #1 " . $re_attrs_fast_safe . " > ~sxSX"; $patterns = array("/<([\?\%]) .*? \\1>/sxSX", #embedded PHP, Perl, kód ASP "/<\!\\]>/sxSX", #CDATA bloky #"/<\!\[ [\x20\r\n\t]* .*? \]>/sxSX", #:UKONČENÉ: Značky typu MS Word... "/<\!--.*?-->/sSX", #comments #MS Word značky ako "...", #podmienené spustenie kódu pre typ IE " HTML " #podmienené spustenie kódu pre typ IE "HTML" #pozri http://www.tigir.com/comments.htm "/<\! (?:--)?+ \[ (?>[^\]"\"]+ | "[^"]*" | \"[^\"]*\")* \] (?:--)?+ > /sxSX",); if ($pair_tags) ( #paired tags 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($patterns); $i = 0; #ochrana slučky $max = 99; while ($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; ) ) #pole značiek, ktoré nebudú odstránené, ak ($allowable_tags) $_allowable_tags = array_flip ($allowable_tags); #pair značky, s ktorými sa bude zaobchádzať ako s odsekmi if ($para_tags) $_para_tags = array_flip($para_tags); ) )#if #tags processing 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 nahradenie... if ($is_format_spaces && strlen($s) != = $length) ( #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); #nahradiť 3 a viac nových riadkov 2 novými riadkami $s = preg_replace(" /[ \r\n](3,)+/sSX", "\ r\n\r\n", $s); ) vrátiť $s; ) ?>

Pozri tiež popis funkcie

Úloha odstrániť všetky alebo len určité html značky z reťazca často vzniká tam, kde je potrebné poskytnúť príležitosť každému návštevníkovi stránky pridať nové informácie. Najbežnejším príkladom by bola kniha návštev alebo systém komentárov na webovej stránke. Takto pridaný text môže obsahovať veľa rôznych značiek, pridaných náhodne pri kopírovaní textu alebo zámerne, aby bola správa akosi „veľmi originálna“. Za zmienku stoja aj zlomyseľné pokusy zaviesť na stránku škodlivý kód v značkách skriptov alebo pokus pokaziť vzhľad stránky zbytočnými značkami.

V každom z týchto prípadov je potrebné pred napísaním nových informácií odstrániť nepotrebné html značky.

Kompletné vyčistenie textu od html tagov

Na takéto úlohy sa často používajú regulárne výrazy, ale v tomto článku zvážime najjednoduchšiu metódu - odstránenie značiek pomocou funkcie strip_tags php. Táto funkcia jednoducho odstráni značky z reťazca uvedeného v parametri.

$str_in = "

môj text s rôzne značky.

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

Výsledkom takéhoto spracovania v premennej $str_out je reťazec bez značiek:

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

* Všimnite si, že funkcia strip_tags odstráni iba samotné štítky, pričom ich obsah ponechá medzi úvodným a záverečným štítkom.

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

Niekedy je potrebné z reťazca odstrániť iba určité značky. Tu použijeme aj funkciu strip_tags, no tentoraz druhým (voliteľným) parametrom sú značky, ktoré sa majú uložiť.

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

$str_in = "

môj text s rôzne značky.

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

Výsledkom takéhoto spracovania v premennej $str_out dostaneme:

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

Týmto spôsobom môžete zadať všetky značky, ktoré sú platné v reťazci, zatiaľ čo všetky ostatné sú odstránené.


Tento článok popisuje najjednoduchší spôsob vymazania reťazca zo značiek. Vzhľadom na ďalšie možnosti tento článok rozšírim. Budem rád, ak v komentároch alebo e-mailom ponúknete svoje možnosti riešenia tohto problému.

Úplne 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 strip_tags() php:
string strip_tags (reťazec str[, string allowable_tags])

Funkcia vracia reťazec zbavený značiek. Allowable_tags sú značky, ktoré by sa nemali odstraňovať. Funkcia funguje, ale mierne povedané, nedokonalá. Počas toho sa nekontroluje platnosť kódu, čo môže viesť k odstráneniu textu, ktorý nie je zahrnutý v značkách.
Vývojári iniciatívy nezostali nečinní – na sieti nájdete vylepšené funkcie. Dobrým príkladom je strip_tags_smart .

Či použiť hotové riešenia alebo nie, je osobná voľba programátora. Stalo sa, že najčastejšie nepotrebujem "univerzálny" handler a je pohodlnejšie vyčistiť kód pomocou regulárnych výrazov.

Čo určuje výber jednej alebo druhej metódy spracovania?

1. Z východiskového materiálu a zložitosti jeho rozboru.
Ak potrebujete spracovať pomerne jednoduché htmp texty, bez akéhokoľvek nápaditého rozloženia, jasné ako deň :), potom môžete použiť štandardné funkcie.
Ak majú texty určité vlastnosti, ktoré je potrebné vziať do úvahy, potom sú tu napísané špeciálne manipulátory. Niektorí môžu použiť iba str_replace . Napríklad:

$s = array("’" => "'", // Pravý apostrof (napr. v I"m)
"“" => """, // Otváracia značka reči
"â€"" => "—", // Dlhá pomlčka
"â€" => """, // Značka ukončenia reči
"Ã" => "é", // e ostrý prízvuk
chr(226) . chr(128) . chr(153) => "'", // Opäť pravý apostrof
chr(226) . chr(128) . chr(147) => "—", // Opäť dlhá pomlčka
chr(226) . chr(128) . chr(156) => """, // Otváracia značka reči
chr(226) . chr(128) . chr(148) => "—", // Znova pomlčka
chr(226) . chr(128) => """, // Pravá značka reči
chr(195) . chr(169) => "é", // e opäť akútne
);

foreach ($s ako $needle => $nahradiť)
{
$htmlText = str_replace($ihla, $nahradit, $htmlText);
}

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

Funkcia getTextFromHTML($htmlText)
{
$search = array(""]*?>.*?"si", // Odstrániť javascript
""]*?>.*?"si", // Odstránenie štýlov
""]*?>.*?"si", // Odstránenie xml tagov
""<[\/\!]*?[^<>]*?>"si", // Odstránenie značiek 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",
""&(kopírovať|#169);"i",
""(\d);"e"); // napíšte ako php

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

Return preg_replace($search, $replace, $htmlText);
}
(V časoch, ako je tento, je viac ako kedykoľvek predtým pekné mať možnosť použiť preg_replace s poľami ako parametre.) V prípade potreby doplníte pole svojimi regulárnymi výrazmi. Napríklad tento konštruktor regulárneho výrazu vám môže pomôcť pri ich kompilácii. Pre začínajúcich vývojárov 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“. Hľadajte tam príklady, analyzujte logiku.

2. Zo zväzkov.
Objemy priamo súvisia so zložitosťou analýzy (z predchádzajúceho odseku). Veľké množstvo textov zvyšuje pravdepodobnosť, že pri snahe predvídať a upratať všetko pomocou regulárnych výrazov vám môže niečo uniknúť. V tomto prípade je vhodná metóda „viacstupňového“ čistenia. To znamená, že najskôr ho vymažte, napríklad pomocou funkcie strip_tags_smart (zdroje pre každý prípad nevymažeme). Potom selektívne preskúmame určitý počet textov, aby sme identifikovali „anomálie“. No a anomálie „upratujeme“ regulárnymi výrazmi.

3. Z toho, čo potrebujete 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 opísal v jednom z predchádzajúcich článkov, to dobre demonštruje. Pripomeniem, že text tam bol v dive, v ktorom bol okrem neho aj div s „strúhankou“, reklama na adsense, zoznam podobných článkov. Pri analýze vzorky článkov sa zistilo, že články neobsahujú obrázky a sú jednoducho rozdelené do odsekov pomocou . Aby ste nečistili „hlavný“ div od cudzích vecí, môžete nájsť všetky odseky (s Simple HTML DOM Parserom je to veľmi jednoduché) a spojiť ich obsah. Takže predtým, ako začnete pravidelne čistiť, zistite, či si vystačíte s trochou krvi.

Vo všeobecnosti medzi zástancami analýzy html kódu, založeného čisto na regulárnych výrazoch, a analýzy, ktorá je založená na analýze DOM štruktúry dokumentu, sa v sieti rozhoria skutočné holiwary. Tu napríklad na prepade. Na prvý pohľad nevinné

Overenie 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 značiek HTML z textu je tu najrelevantnejšie, pretože sú najviac náchylné na injekcie tretích strán. V tomto článku vám chcem pripomenúť staré stip_tags() a jeho triky, ako aj ponúknuť riešenia na odstránenie sekčných značiek HTML a niekoľko užitočných bonusov po tom.

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

$s = "

Odsek.

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

Tento príklad vypíše riadok:

Odsek. Viac textu.

Tu je pozoruhodné, že funkcia má sekundu (nepovinné, ale užitočné) parameter, ktorého hodnotou je reťazec so zoznamom povolených značiek HTML, napríklad:

$s = "

Odsek.

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

Tento príklad vypíše riadok:

Odsek.

Viac textu.

Podľa mňa veľmi pohodlné. To však nerieši jeden dôležitý problém - odstránenie značiek sekcií HTML, napríklad: script , noscript a style sú najčastejšie. Keď potrebujem odstrániť takéto značky sekcií, 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). Zostáva iba nahradiť riadok a z textu odstránime odpadky HTML.

Je zrejmé, že vyššie uvedené dve riešenia je možné kombinovať. Na začiatku používam náhradu regulárnych výrazov a potom strip_tags() a získam vlastnú funkciu nohtml().

Na záver vám chcem ponúknuť niekoľko užitočných riešení. Takže v texte je lepšie nahradiť tabuľku medzerou, výsledok interpretácie oboch v prehliadači je rovnaký a bude menej problémov, napríklad:

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

Ak nepotrebujete zalomenie riadkov, môžete ich nahradiť aj medzerami, napríklad:

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

Nadbytočných medzier sa môžete zbaviť jednoduchým regulárnym výrazom, napríklad:

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

To je z mojej strany všetko. Ďakujem za tvoju pozornosť. Veľa štastia!

o 21:56 Upraviť správu



Stránky pomocníka pre počítače

© Copyright 2022,
rzdoro.ru – stránka počítačovej pomoci

  • Kategórie
  • železo
  • Windows 10
  • Skenovanie
  • Windows 7
  • železo
  • Windows 10
  • Skenovanie
  • Windows 7