Stargazer etiketleri php. PHP: HTML etiketleri metinden nasıl çıkarılır? Metinden tek tek html etiketlerini kaldırma

  • 03.11.2019

Kesinlikle herkes gereksiz etiketlerden html temizleme görevi ile karşı karşıyadır.

Akla gelen ilk şey strip_tags() php fonksiyonunu kullanmaktır:
string strip_tags (string str [, string allowable_tags])

İşlev, etiketlerden arındırılmış bir dize döndürür. Kaldırılmaması gereken etiketler, allow_tags bağımsız değişkeni olarak iletilir. İşlev çalışıyor, ancak en hafif tabirle mükemmel değil. Yol boyunca, etiketlerde yer almayan metnin kaldırılmasını gerektirebilecek kodun geçerliliği için bir kontrol yoktur.
Proaktif geliştiriciler boş boş oturmadılar - gelişmiş işlevler internette bulunabilir. Strip_tags_smart iyi bir örnektir.

Hazır çözümleri kullanmak veya kullanmamak programcının kişisel tercihidir. Öyle oldu ki, çoğu zaman "evrensel" bir işleyiciye ihtiyacım yok ve kodu normal ifadelerle temizlemek daha uygun.

Bu veya bu işleme yönteminin seçimini ne belirler?

1. Kaynak materyalden ve analizinin karmaşıklığından.
Oldukça basit htmp metinlerini, süslü bir düzen olmadan, gün gibi net bir şekilde işlemeniz gerekiyorsa, o zaman standart işlevleri kullanabilirsiniz.
Metinlerde dikkate alınması gereken belirli özellikler varsa, o zaman özel işleyicilerin yazıldığı yer burasıdır. Bazıları sadece str_replace kullanabilir. Örneğin:

$ s = dizi ("â € ™" => "' ", // Sağ kesme işareti (örn. I" m'de)
"â € œ" => "“ ", // Açılış konuşma işareti
"â €“ "=>" - ", // Uzun tire
"â €" => "” ", // Kapanış konuşma işareti
"Ã" => "é", // e akut vurgu
chr (226). chr (128). chr (153) => "' ", // Tekrar sağa kesme işareti
chr (226). chr (128). chr (147) => "-", // Tekrar uzun tire
chr (226). chr (128). chr (156) => "“ ", // Açılış konuşma işareti
chr (226). chr (128). chr (148) => "-", // M tekrar çizgi
chr (226). chr (128) => "” ", // Sağ konuşma işareti
chr (195). chr (169) => "é", // e tekrar akut
);

foreach ($ s as $ iğne => $ yerine)
{
$ htmlText = str_replace ($iğne, $değiştir, $htmlText);
}

Diğerleri dayalı olabilir düzenli ifadeler... Örnek olarak:

işlev getTextFromHTML ($ htmlText)
{
$ arama = dizi (""]*?>.*?"si", // javaScript'i kaldır
""]*?>.*?"si", // Stilleri kaldır
""]*?>.*?"si", // xml etiketlerini kaldır
""<[\/\!]*?[^<>] *?> "si", // HTML etiketlerini kaldır
"" ([\ r \ n]) [\ s] "", // Boşlukları kaldırın
"" & (quot | # 34); "i", // HTML özel karakterlerini değiştir
"" & (amp | # 38); "i",
"" & (lt | # 60); "i",
"" & (gt | # 62); "i",
"" & (nbsp | # 160); "i",
"" & (iexcl | # 161); "i",
"" & (yüzde | # 162); "i",
"" & (pound | # 163); "i",
"" & (kopya | # 169); "i",
"" (\ d); "e"); // php olarak yaz

$ değiştir = dizi ("",
"",
"",
"",
"\\1",
"\"",
"&",
"<",
">",
" ",
chr (161),
chr (162),
chr (163),
chr (169),
"chr (\\ 1)");

preg_replace döndür ($ arama, $ değiştirme, $ htmlText);
}
(Böyle anlarda, preg_replace'in dizilerle parametre olarak çalışabilmesi her zamankinden daha fazla memnuniyet vericidir). Gerekirse, diziyi düzenlilerinizle tamamlarsınız. Örneğin, bu normal ifade oluşturucu bunları derlemenize yardımcı olabilir. Acemi geliştiriciler, "HTML etiketleri hakkında her şey. HTML etiketlerini çıkarmak için 9 Normal İfade" makalesini yararlı bulabilir. Oradaki örneklere bakın, mantığı analiz edin.

2. Ciltlerden.
Hacimler, analizin karmaşıklığı ile doğrudan ilişkilidir (önceki paragraftan). Çok sayıda metin, her şeyi düzenli olarak öngörmeye ve temizlemeye çalışarak bir şeyleri kaçırma olasılığınızı artırır. Bu durumda, "çok aşamalı" temizleme yöntemi uygundur. Yani, önce strip_tags_smart işlevini kullanarak temizleyin (her ihtimale karşı kaynakları silmiyoruz). Ardından, "anomalileri" belirlemek için bir dizi metni seçici olarak tararız. Normal çizgilerle anormallikleri "temizliyoruz".

3. Sonuç olarak elde edilmesi gerekenlerden.
İşleme algoritması duruma bağlı olarak farklı şekillerde basitleştirilebilir. Önceki makalelerden birinde anlattığım durum bunu çok iyi gösteriyor. Oradaki metnin bir div'de olduğunu hatırlatayım, buna ek olarak içinde "ekmek kırıntıları" olan bir div, bir adsense reklamı, benzer yazıların bir listesi de vardı. Bir makale örneği analiz edildiğinde, makalelerin şekil içermediği ve sadece kullanılarak paragraflara ayrıldığı tespit edildi. "Ana" div'i gereksiz şeylerden temizlememek için tüm paragrafları bulabilir (Simple HTML DOM Ayrıştırıcı ile çok basittir) ve içeriklerini birleştirebilirsiniz. Bu yüzden düzenli temizlik yapmadan önce, biraz kanla geçinebilecek misin bir bak.

Genel olarak, yalnızca düzenli ifadelere dayanan html kodunu ayrıştırma ve belgenin DOM yapısının analizine dayanan ayrıştırma destekçileri arasında, ağda gerçek holivarlar alevlenir. Örneğin, taşma. İlk bakışta masum

Bir dizeden tüm veya yalnızca belirli html etiketlerini kaldırma görevi, genellikle herhangi bir sayfa ziyaretçisinin yeni bilgiler eklemesi için bir fırsat sağlamanın gerekli olduğu durumlarda ortaya çıkar. En yaygın örnek, bir ziyaretçi defteri veya bir site yorum sistemi olabilir. Bu şekilde eklenen metin, metni kopyalarken yanlışlıkla veya mesajı bir şekilde "çok orijinal" hale getirmek için kasıtlı olarak eklenen birçok farklı etiket içerebilir. Ayrıca, komut dosyası etiketlerinde siteye kötü amaçlı kod enjekte etme girişimleri veya sayfa düzenini gereksiz etiketlerle bozma girişimi de dikkate değer.

Yukarıdaki durumlardan herhangi birinde, yeni bilgi yazmadan önce gereksiz html etiketlerinden temizlemek gerekli hale gelir.

Html etiketlerinden metnin tamamen temizlenmesi

Normal ifadeler genellikle bu tür görevler için kullanılır, ancak bu makalede en basit yöntemi ele alacağız - strip_tags php işlevini kullanarak etiketleri kaldırmak. Bu işlev, etiketleri belirtilen dizeden kaldırır.

$ str_in = "

Benim Metin ile birlikte çeşitli etiketler.

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

Bu işlemin bir sonucu olarak, $ str_out değişkeninde etiketsiz bir dize elde ederiz:

Çeşitli etiketlerle metnim.

* strip_tags işlevinin yalnızca etiketlerin kendisini ayırdığını ve içeriklerini açılış ve kapanış etiketleri arasında bıraktığını unutmayın.

Tek tek html etiketlerini metinden kaldırma

Bazen bir dizeden yalnızca belirli etiketleri çıkarmanız gerekir. Burada strip_tags fonksiyonunu da kullanacağız fakat bu sefer ikinci (opsiyonel) parametre ile kaydedilecek tagları belirteceğiz.

Örneğin, bir dizeyi işlerken, yalnızca bağlantı bırakmanız gerekir:

$ str_in = "

Benim Metin ile birlikte çeşitli etiketler.

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

$ str_out değişkenindeki bu işlemin sonucunda şunu elde ederiz:

Çeşitli etiketlerle metnim.

Böylece, dizede geçerli olan tüm etiketleri belirtebilirsiniz, diğerleri ise kaldırılacaktır.


Bu makalede, bir dizeden etiketleri temizlemenin en kolay yolu anlatılmaktadır. Diğer seçenekleri düşündüğümde, bu makaleyi genişleteceğim. Bu sorunu çözmek için seçeneklerinizi yorumlarda veya e-posta ile önerirseniz sevinirim.

Gelen verileri kontrol etmek ve işlemek, programlamadaki yaygın görevlerden biridir. PHP dili genellikle web uygulamaları için kullanılır, bu nedenle metinden HTML etiketlerinin çıkarılması en çok burada önemlidir, çünkü bunlar üçüncü taraf enjeksiyonlarına en duyarlı olanlardır. Bu yazıda size eski stip_tags() ve püf noktalarını hatırlatmak, ayrıca bölümsel HTML etiketlerini kaldırmak için çözümler ve takip etmeniz gereken birkaç faydalı bonus önermek istiyorum.

Yani. Metinden HTML etiketlerini kaldırmak için ana aracımız strip_tags () işlevidir. ona veriyoruz sicim değer ve ondan HTML ve PHP etiketlerini kaldırır, örneğin:

$s = "

Paragraf.

Daha fazla metin. ";
echo strip_tags ($ s);

Bu örnek şu satırı çıkaracaktır:

Paragraf. Daha fazla metin.

Burada dikkat çekicidir ki, fonksiyonun ayrıca ikinci bir (isteğe bağlı ama kullanışlı) değeri, izin verilen HTML etiketlerinin listesini içeren bir dize olan bir parametre, örneğin:

$s = "

Paragraf.

Daha fazla metin. ";
echo strip_tags ($ s, "

Bu örnek şu satırı çıkaracaktır:

Paragraf.

Daha fazla metin.

Benim düşünceme göre, çok uygun. Ancak, bu önemli bir sorunu çözmez - kesitsel HTML etiketlerini kaldırmaörneğin komut dosyası, noscript ve stil en yaygın olanlarıdır. Bu tür bölüm etiketlerini ve “ ile başlayan seçenekleri kaldırmam gerektiğinde< » и заканчивающиеся символом « >", aşağıdaki PHP kodunu kullanıyorum:

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

Burada $ p değişkeni bir dizi düzenli ifade içerir ve $ r, karşılık gelen değiştirmelerinin bir dizisidir. (boşluk kullanıyorum)... Geriye kalan tek şey satırı değiştirmek ve metinden HTML çöpünü kaldıracağız.

Açıkçası, yukarıdaki iki çözüm birleştirilebilir. İlk olarak, normal ifade değiştirmeyi ve ardından strip_tags() işlevini kullanıyorum ve sonunda kendi nohtml() işlevimi elde ediyorum.

Son olarak, size daha faydalı çözümler sunmak istiyorum. Bu nedenle, metinde sekmeleri bir boşlukla değiştirmek daha iyidir, her ikisini de tarayıcıda yorumlamanın sonucu aynıdır ve güçlük daha az olacaktır, örneğin:

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

Satır sonlarına ihtiyacınız yoksa, boşluklarla da değiştirilebilirler, örneğin:

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

Basit bir normal ifadeyle fazladan boşluklardan kurtulabilirsiniz, örneğin:

$ s = preg_replace ("/ \ s + /", "", $ s);
$ s = kırp ($ s); // gereksiz olmayacak

Benim için hepsi bu. Dikkatiniz için teşekkürler. İyi şanlar!

21:56'da Mesajı değiştir

JavaScript tarayıcınızda engellendi. Lütfen sitenin çalışması için JavaScript'i etkinleştirin!

strip_tags

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

strip_tags- Bir dizeden HTML ve PHP etiketlerini kaldırır

Açıklama

sicim strip_tags(string str [, string allowable_tags])

Bu işlev, HTML ve PHP etiketlerinin kaldırıldığı dizgeyi döndürür. Etiketleri kaldırmak için, fonksiyonda kullanılana benzer bir otomat kullanılır. fgets () .

Kaldırılmaması gereken etiketleri belirtmek için isteğe bağlı ikinci argüman kullanılabilir.

Yorum Yap: Allowable_tags bağımsız değişkeni PHP 3.0.13 ve PHP 4.0b3'te eklendi. PHP 4.3.0'dan itibaren HTML yorumları da kaldırılmıştır.

Dikkat

Çünkü strip_tags () HTML kodunun doğruluğunu kontrol etmez, eksik etiketler, etiketlerde yer almayan metnin silinmesine neden olabilir.

Örnek 1. Kullanım örneği strip_tags ()
$ metin = "

Paragraf.

Biraz daha metin "; echo strip_tags ($ metin); echo" \ n \ n ------- \ n "; // kaldırma

Echo strip_tags ($ metin, "

"); // İzin vermek ,,echo strip_tags ($ metin, " ");

Bu örnek çıktı verecektir:

Paragraf. Biraz daha metin -------

Paragraf.

Biraz daha metin

Dikkat

Bu işlev, stil ve onmouseover dahil olmak üzere allow_tags bağımsız değişkeninde belirtilen etiketlerin özniteliklerini değiştirmez.

PHP 5.0.0'dan beri strip_tags () verileri ikili biçimde işlemek için güvenlidir.

Bu işlevin önemli bir dezavantajı vardır - etiketleri kaldırırken kelimelerin yapıştırılmasıdır. Ayrıca, işlevin güvenlik açıkları vardır. strip_tags'e benzer alternatif bir işlev:

c "* -" kirli "html, etiket öznitelik değerlerinde semboller bulunduğunda doğru şekilde işlenir< >* - bozuk html doğru işlenir * - yorumlar, komut dosyaları, stiller, PHP, Perl, ASP kodu, MS Word etiketleri, CDATA kesilir * - html kodu içeriyorsa metin otomatik olarak biçimlendirilir * - sahteciliğe karşı koruma: "<komut dosyası> uyarı ("merhaba") script> "* * @param string $ s * @param array $ allow_tags Kesilmeyecek etiket dizisi * Örnek:" b "- etiket niteliklerle birlikte kalacak," "- etiket özniteliksiz kalacak * @param bool $ is_format_spaces Biçim boşlukları ve satır sonları? * Çıktı metni (düz) tarayıcıdaki giriş metnine mümkün olduğunca yakındır. * Başka bir deyişle, metni akıllıca dönüştürür / * Metin yalnızca herhangi bir etiket çıkarılmışsa biçimlendirilir * @Param dizisi $ pair_tags içerikle birlikte kaldırılacak eşleştirilmiş etiket adları dizisi * varsayılan değerlere bakın * @param dizisi $ para_tags dizisi paragraf olarak değerlendirilecek eşleştirilmiş etiket adları ($ is_format_spaces = true ise) * varsayılanlara bakın * @return string * * @license http://creativecommons.org/licenses/by-sa/3.0/ * @author Nasibullin Rinat , http: //orangetie.ru/ * @charset ANSI * @sürüm 4.0.14 * / function strip_tags_smart (/ * string * / $ s, dizi $ allow_tags = null, / * boolean * / $ is_format_spaces = true, dizi $ pair_tags = dizi ("script", "style", "map", "iframe", "frameset", "object", "applet", "co mment "," düğme "," textarea "," seç "), dizi $ para_tags = dizi (" p "," td "," th "," li "," h1 "," h2 "," h3 ", "h4", "h5", "h6", "div", "form", "title", "pre")) (// strip_tags ($ s); statik $ _callback_type = yanlış; statik $ _allowable_tags = dizi (); statik $ _para_tags = dizi (); #etiket nitelikleri için normal ifade #tek baytlı veya çok baytlı UTF-8 karakter kümesinde kirli ve bozuk HTML'yi doğru işlemler! static $ re_attrs_fast_safe = "(?!) #ifadesi, bir etiketten sonra gelir (?> [^>" \ "] + | (?<=[\=\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) (if öznitelikli #tag if (array_key_exists ($) etiketi, $ _allowable_tags)) return $ s; özniteliksiz #tag if (array_key_exists ("<" . $tag . ">", $ _allowable_tags)) (if (substr ($ s, 0, 2) ===""; if (substr ($ s, -2) ===" /> ") dönüş"<" . $tag . " />"; dönüş"<" . $tag . ">";)) if ($ tag ===" br ") return" \ r \ n "; if ($ _para_tags && array_key_exists ($ tag, $ _para_tags)) return" \ r \ n \ r \ n "; return "";) trigger_error ("Bilinmeyen geri arama türü" ". $ _callback_type." "!", E_USER_ERROR);) if (($ pos = strpos ($ s, "<")) === false || strpos($s, ">", $ pos) === false) #speed geliştirme (#etiketler bulunamadı dönüş $ s;) $ uzunluk = strlen ($ s); #eşlenmemiş etiketler (açma, kapama,! DOCTYPE, MS Word ad alanı) $ re_tags = "~: * +)?) # 1 ". $ Re_attrs_fast_safe."> ~ SxSX "; $ desenler = dizi (" /<([\?\%]) .*? \\1>/ sxSX ", # gömülü PHP, Perl, ASP kodu" /<\!\\]>/ sxSX ", # CDATA blokları #" /<\!\[ [\x20\r\n\t]* .*? \]>/ sxSX ", #: KULLANIMDAN KALDIRILDI: MS Word etiketleri gibi... "/<\!--.*?-->/ sSX ", # yorum #MS Word etiketleri gibi"...", # IE türü için koşullu kod yürütme" HTML "IE türü için # koşullu kod yürütme"HTML"# bkz. http://www.tigir.com/comments.htm" /<\! (?:--)?+ \[ (?>[^ \] "\"] + | "[^"] * "| \" [^ \ "] * \") * \] (?: -)? +> / sxSX ",); if ($ pair_tags) (içeriği olan # eşleştirilmiş etiket: foreach ( $ pair_tags as $ k => $ v) $ pair_tags [$ k] = preg_quote ($ v, "/"); $ desen = "/<((?i:" . implode("|", $pair_tags) . "))" . $re_attrs_fast_safe . "(? .*? <\/(?i:\\1)" . $re_attrs_fast_safe . ">/ sxSX ";) #d ($ desenleri); $ i = 0; # döngü koruması $ 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;)) # if ($ allowable_tags) $ _allowable_tags = array_flip ($ allow_tags); # if ($ para_tags) $ _para_tags = array_flip ($ para_tags);)) #if #tags if ($ is_html) işleniyor ($ _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); #değiştirmek için çok fazla döngü ... if ($ is_format_spaces && strlen ($ s)! = = $ uzunluk) (#yinelenen boşlukları kaldır $ s = preg_replace ("/ \ x20 \ x20 ++ / sSX", "", trim ($ s)); #yeni satırlardan önce ve sonra bir boşluk kaldır $ s = str_replace (dizi ("\ r \ n \ x20", "\ x20 \ r \ n"), "\ r \ n", $ s); #3 ve daha fazla yeni satırı 2 yeni satırla değiştir $ s = preg_replace ("/ [ \ r \ n] (3,) + / sSX "," \ r \ n \ r \ n ", $ s); ) $ s döndür; )?>

Ayrıca fonksiyon açıklamasına bakın




Bilgisayar yardım sitesi

© Telif hakkı 2021,
rzdoro.ru - Bilgisayar yardım sitesi

  • Kategoriler
  • Demir
  • Windows 10
  • Tarama
  • Windows 7
  • Demir
  • Windows 10
  • Tarama
  • Windows 7