Php čišćenje html tagova. PHP: kako ukloniti HTML oznake iz teksta? Potpuno brisanje teksta iz html oznaka

Validacija i obrada dolaznih podataka jedan je od najčešćih programskih zadataka. PHP jezik se obično koristi za web aplikacije, tako da je ovdje najvažnije ukloniti HTML oznake iz teksta, jer su one najpodložnije ubacivanju treće strane. U ovom članku želim vas podsjetiti na stari stip_tags() i njegove značajke, kao i ponuditi rješenja za uklanjanje sekcijskih HTML oznaka i još nekoliko korisnih bonusa koji idu uz to.

Tako. Naš glavni alat za uklanjanje HTML oznaka iz teksta je funkcija strip_tags(). Kažemo joj niz vrijednost i iz nje uklanja HTML i PHP oznake, na primjer:

$s = "

stavak

Više teksta.";
echo strip_tags($s);

Ovaj primjer će ispisati redak:

stavak Više teksta.

Ovdje je važno napomenuti da funkcija također ima drugi (neobavezni, ali koristan) parametar, čija je vrijednost niz s popisom dopuštenih HTML oznaka, na primjer:

$s = "

stavak

Više teksta.";
echo strip_tags($s, "

Ovaj primjer će ispisati redak:

stavak

Više teksta.

Po mom mišljenju, to je vrlo povoljno. Međutim, to ne rješava jedan važan problem - uklanjanje sekcijskih HTML oznaka, na primjer: script, noscript i style - ove su najčešće. Kada trebam ukloniti takve oznake odjeljaka, kao i opcije koje počinju s "< » и заканчивающиеся символом « >", koristim sljedeći PHP kod:

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

Ovdje varijabla $p sadrži niz regularnih izraza, a $r je niz njihovih odgovarajućih zamjena (koristim razmake). Ostaje samo napraviti zamjenu u retku, a mi ćemo ukloniti HTML smeće iz teksta.

Očito, dva gornja rješenja mogu se kombinirati. Na početku koristim zamjenu kroz regularne izraze, a zatim strip_tags() i dobivam vlastitu nohtml() funkciju.

Na kraju, želim vam ponuditi još nekoliko korisnih rješenja. Dakle, u tekstu je bolje zamijeniti tabulator razmakom; rezultat tumačenja oba u pregledniku je identičan i bit će manje gnjavaže, na primjer:

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

Ako vam prijelomi redaka nisu potrebni, oni se također mogu zamijeniti razmacima, na primjer:

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

Možete se riješiti dodatnih razmaka pomoću jednostavnog regularnog izraza, na primjer:

$s = preg_replace("/\s+/", " ", $s);
$s = trim($s); // ne bi bilo na odmet

To je sve što imam. Hvala vam na pažnji. Sretno!

u 21:56 sati Uredi poruku

Apsolutno svatko se suočava sa zadatkom čišćenja HTML-a od nepotrebnih oznaka.

Prva stvar koja pada na pamet je korištenje strip_tags() php funkcije:
niz strip_tags (string str [, niz dozvoljenih_oznaka])

Funkcija vraća niz bez oznaka. Oznake koje se ne moraju ukloniti prosljeđuju se kao argument allowable_tags. Funkcija radi, ali, blago rečeno, nije idealna. Usput, nema provjere valjanosti koda, što može značiti brisanje teksta koji nije uključen u oznake.
Proaktivni programeri nisu sjedili prekriženih ruku - poboljšane funkcije mogu se pronaći na internetu. Dobar primjer je strip_tags_smart.

Koristiti ili ne koristiti gotova rješenja osobni je izbor programera. Događa se da najčešće ne trebam "univerzalni" rukovatelj i prikladnije je očistiti kod regularnim izrazima.

Što određuje izbor jedne ili druge metode obrade?

1. Od izvornog materijala i složenosti njegove analize.
Ako trebate obraditi prilično jednostavne htmp tekstove, bez ikakvih otmjenih rasporeda, jasno kao dan :), tada možete koristiti standardne funkcije.
Ako tekstovi imaju određene značajke koje treba uzeti u obzir, pišu se posebni rukovatelji. Neki mogu jednostavno koristiti str_replace. Na primjer:

$s = array("’" => "’", // Desni apostrof (npr. u I"m)
"“" => "“", // Oznaka za početni govor
"– => "—", // Duga crtica
"â€" => "”", // Završni govorni znak
"Ã " => "é", // e akutni naglasak
chr(226) . chr(128) . chr(153) => "’", // Ponovno desni apostrof
chr(226) . chr(128) . chr(147) => "—", // Opet duga crtica
chr(226) . chr(128) . chr(156) => "“", // Oznaka za početni govor
chr(226) . chr(128) . chr(148) => "—", // M opet crtica
chr(226) . chr(128) => "”", // Desna govorna oznaka
chr(195) . chr(169) => "é", // e opet akut
);

foreach ($s kao $needle => $replace)
{
$htmlTekst = str_replace($needle, $replace, $htmlText);
}

Drugi se mogu temeljiti na regularnim izrazima. Kao primjer:

Funkcija getTextFromHTML($htmlText)
{
$search = array (""]*?>.*?"si", // Ukloni javaScript
""]*?>.*?"si", // Ukloni stilove
""]*?>.*?"si", // Ukloni xml oznake
"""si", // Ukloni HTML oznake
""([\r\n])[\s] "", // Ukloni razmake
""&(quot|#34);"i", // Zamijeni HTML posebne znakove
""&(amp|#38);"i",
""&(lt|#60);"i",
""&(gt|#62);"i",
""&(nbsp|#160);"i",
""&(iexcl|#161);"i",
""&(cent|#162);"i",
""&(pound|#163);"i",
""&(copy|#169);"i",
""(\d);"e"); // pisati kao php

$zamijeni = niz("",
"",
"",
"",
"\\1",
"\"",
"&",
"",
" ",
chr(161),
chr(162),
chr(163),
chr(169),
"chr(\\1)");

Vrati preg_replace($search, $replace, $htmlText);
}
(U takvim trenucima, sposobnost preg_replace da radi s nizovima kao parametrima je ugodnija nego ikad). Po potrebi nadopunjujete niz vlastitim stalnim korisnicima. Na primjer, ovaj konstruktor regularnih izraza može vam pomoći u njihovom sastavljanju. Programerima početnicima članak "Sve o HTML oznakama. 9 regularnih izraza za uklanjanje HTML oznaka" može biti koristan. Pogledajte primjere tamo, analizirajte logiku.

2. Iz svezaka.
Volumeni su izravno povezani sa složenošću analize (iz prethodnog odlomka). Velik broj tekstova povećava vjerojatnost da, pokušavajući sve isplanirati i pospremiti na redovit način, nešto propustite. U ovom slučaju prikladna je "višestupanjska" metoda čišćenja. To jest, prvo ga očistite, na primjer, funkcijom strip_tags_smart (ne brišemo izvorni kod, za svaki slučaj). Zatim selektivno pregledavamo određeni broj tekstova kako bismo identificirali "anomalije". Pa, "čistimo" anomalije redovnim pravilima.

3. Od onoga što bi trebalo dobiti kao rezultat.
Algoritam obrade može se pojednostaviti na različite načine, ovisno o situaciji. Slučaj koji sam opisao u jednom od prethodnih članaka to dobro pokazuje. Podsjećam da je tamo bio tekst u divu, u kojem je osim njega bio i div s “mrvicama kruha”, Adsense reklama i popis sličnih članaka. Prilikom analize uzorka članaka, otkriveno je da članci ne sadrže slike i jednostavno su podijeljeni u odlomke pomoću . Kako ne biste čistili "glavni" div od suvišnih stvari, možete pronaći sve odlomke (s Simple HTML DOM Parserom to je vrlo jednostavno) i kombinirati njihov sadržaj. Dakle, prije nego počnete redovito čistiti, provjerite možete li proći s malo krvi.

Općenito, između pristaša raščlanjivanja HTML koda, temeljenog isključivo na regularnim izrazima, i raščlanjivanja, koje se temelji na analizi DOM strukture dokumenta, na internetu se rasplamsavaju prave vatrene borbe. Na primjer, na preljevu. Nevino na prvi pogled

Zadatak uklanjanja svih ili samo određenih html oznaka iz niza često se javlja kada je potrebno pružiti mogućnost svakom posjetitelju stranice da doda nove informacije. Najčešći primjer bila bi knjiga gostiju ili sustav komentara na web stranici. Tekst dodan na ovaj način može sadržavati mnogo različitih oznaka, dodanih slučajno prilikom kopiranja teksta ili namjerno kako bi poruka bila nekako “vrlo originalna”. Također vrijedi spomenuti zlonamjerne pokušaje uvođenja zlonamjernog koda na web mjesto u oznakama skripte ili pokušaj kvarenja izgleda stranice nepotrebnim oznakama.

U bilo kojem od gore navedenih slučajeva potrebno je očistiti ga od nepotrebnih html oznaka prije snimanja novih informacija.

Potpuno brisanje teksta iz html oznaka

Regularni izrazi često se koriste za takve zadatke, ali u ovom članku ćemo pogledati najjednostavniju metodu - uklanjanje oznaka pomoću strip_tags php funkcije. Ova funkcija jednostavno uklanja oznake iz niza navedenih u parametru.

$str_in = "

Moj tekst iz razne oznake.

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

Kao rezultat ove obrade dobivamo niz bez oznaka u varijabli $str_out:

Moj tekst sa raznim tagovima.

* Vrijedno je napomenuti da funkcija strip_tags uklanja samo same oznake, ostavljajući njihov sadržaj između početnih i završnih oznaka.

Uklanjanje pojedinačnih html oznaka iz teksta

Ponekad samo trebate ukloniti određene oznake iz niza. Ovdje ćemo također koristiti funkciju strip_tags, ali ovaj put ćemo navesti oznake koje je potrebno spremiti kao drugi (neobavezni) parametar.

Na primjer, kada obrađujete niz, trebate ostaviti samo veze:

$str_in = "

Moj tekst iz razne oznake.

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

Kao rezultat ove obrade u varijabli $str_out dobivamo:

Moj tekst sa raznim tagovima.

Na ovaj način možete navesti sve oznake koje su važeće u nizu, dok se sve ostale uklanjaju.


Ovaj članak govori o najlakšem načinu brisanja niza oznaka. Dok budem razmatrao druge opcije, proširit ću ovaj članak. Bilo bi mi drago ako predložite svoje mogućnosti za rješavanje ovog problema u komentarima ili putem e-pošte.

JavaScript je blokiran u vašem pregledniku. Omogućite JavaScript kako bi stranica radila!

trake_oznake

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

strip_tags - Uklanja HTML i PHP oznake iz niza Opis string strip_tags (string str [, string allowable_tags])

Ova funkcija vraća niz str s uklonjenim HTML i PHP oznakama. Za uklanjanje oznaka koristi se automat sličan onom koji se koristi u funkciji fgets().

Neobavezni drugi argument može se koristiti za određivanje oznaka koje se ne smiju uklanjati.

Napomena: argument allowable_tags dodan je u PHP 3.0.13 i PHP 4.0b3. HTML komentari su također uklonjeni iz PHP 4.3.0.

Pažnja

Budući da strip_tags() ne provjerava ispravnost HTML koda, nepotpune oznake mogu dovesti do uklanjanja teksta koji nije dio oznaka.

Primjer 1. Primjer korištenja strip_tags() $text = "

stavak

Još malo teksta"; echo strip_tags($text); echo "\n\n-------\n"; // ne briši

Echo strip_tags($text, "

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

Ovaj primjer će ispisati:

stavak Još malo teksta -------

stavak

Još malo teksta

Pažnja

Ova funkcija ne mijenja atribute oznaka navedenih u argumentu allowable_tags, uključujući stil i onmouseover.

Od PHP 5.0.0, strip_tags() je siguran za obradu podataka u binarnom obliku.

Ova funkcija ima značajan nedostatak - lijepi riječi prilikom uklanjanja oznaka. Osim toga, funkcija ima ranjivosti. Alternativna funkcija slična strip_tags:

Vidi također opis funkcije