PHP etiketlerini temizleme. PHP'de bir dizeden HTML etiketlerini kaldırma. Metinden tek tek html etiketlerini kaldırma

  • 20.06.2020

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ışır, ancak hafifçe söylemek gerekirse mükemmel değil. Bu arada, etiketlerde yer almayan metnin kaldırılmasını gerektirebilecek kodun geçerliliği için herhangi bir kontrol yoktur.
Proaktif geliştiriciler boş boş oturmadı - değiştirilmiş işlevleri internette bulabilirsiniz. Strip_tags_smart iyi bir örnektir.

Hazır çözümleri uygulamak veya uygulamamak 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.
Metinlerin dikkate alınması gereken belirli özellikleri 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 faydalı 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 gözden 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şı kaynak kodunu 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, bunun yanında 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 incelenirken, makalelerin şekil içermediği ve basitçe paragraflara bölündüğü 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, web'de gerçek holivarlar alevlenir. Örneğin, taşma. İlk bakışta masum

Aynı şekilde kullanıcılardan veri aldığınızda, onlardan iletilen verileri işlemek ve çıktıda net metin almak mantıklıdır.

Şimdi size bunun farklı şekillerde nasıl yapılabileceğini anlatacağım.

PHP'de bir dizeden tüm HTML etiketleri nasıl kaldırılır?

PHP'nin “adlı bir işlevi vardır. strip_tags". Bir değişkenden tüm HTML etiketlerini hızlı ve kolay bir şekilde kaldırmanıza olanak tanır.

Uygulama:

Selam Dünya!"; $ içerik = strip_tags ($ içerik); echo $ içerik; // "Merhaba dünya! "?>

Selam Dünya!


"; $ içerik = strip_tags ($ içerik,"

"); echo $ içerik; // Yazdırır" Merhaba dünya!

Lorem ipsum dolor sit amet, conectetur adipiscing elit.
Vivamus sed lacus vel diam conectetur rhoncus ve eget justo.

" ?>

Bu durumda, etiketleri kaydederiz

VE ... Bitiş etiketi olan etiketleri kaydederken kaydetmeniz gerekmez.

Not, işlev HTML işaretlemesinin geçerliliğini kontrol etmez ve kapatılmamış etiketler varsa, normal metni kaybetme riskiyle karşı karşıya kalırsınız.

JavaScript'te bir dizeden tüm HTML etiketleri nasıl kaldırılır?

JavaScript'te, daha sonra alınan verileri işleyeceğimiz kendi küçük işlevimizi yazacağız.

Uygulama:

Bu örnek, belirli bir değişken üzerinde çalışır, ancak onu, örneğin giriş alanından alınan içeriğe uyacak şekilde değiştirebilirsiniz.

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ı, üçüncü taraf enjeksiyonuna en duyarlı oldukları için burada en alakalı olanıdır. Bu yazıda size yaşlı adam stip_tags() ve püf noktalarını hatırlatmak, ayrıca kesitsel HTML etiketlerini kaldırmak için çözümler ve takip etmeniz gereken birkaç faydalı bonus daha ö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 önce normal ifade değiştirmeyi ve ardından strip_tags() işlevini kullanıyorum ve kendi nohtml() işlevimi alıyorum.

Son olarak, size daha faydalı çözümler sunmak istiyorum. Bu nedenle, metinde tabloyu 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

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;

$ str_out değişkenindeki bu tür bir işlemin sonucu olarak, etiketsiz bir dize elde ederiz:

Çeşitli etiketlerle metnim.

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

Metinden tek tek html etiketlerini 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 kaydedilmesi gereken tagları belirteceğiz.

Örneğin, bir dize 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.