Bir preg_replace bir dönüştürme eregi_replace

1 Cevap php

Ben bazı HTML parçacıkları ayrıştırmak için çalışıyor ve çeşitli nedenlerle (XSS vd) için onları temizlemek istediğiniz ediyorum.

Ben şu anda bir çıpa üzerinde href dışında, herhangi bir etiketi üzerindeki tüm niteliklerini kaldırmak için çalışıyorum. Ben eregi_replace aramaların bir dizi kullanarak bu yapıyorum, ama ben preg_replace kullanarak bunu yapmanın daha akıllı bir yol ve satır kod sadece bir çift vardır eminim, ama ben işe almak mümkün olmamıştır. Herkes yardımcı olabilir?

Şu kodu:

$data_item = eregi_replace("<p[^>]*>","<p>", $data_item);
$data_item = eregi_replace("<h2[^>]*>","<h2>", $data_item);
$data_item = eregi_replace("<h3[^>]*>","<h3>", $data_item);
$data_item = eregi_replace("<h4[^>]*>","<h4>", $data_item);
$data_item = eregi_replace("<h5[^>]*>","<h5>", $data_item);
$data_item = eregi_replace("<h6[^>]*>","<h6>", $data_item);
$data_item = eregi_replace("<ul[^>]*>","<ul>", $data_item);
$data_item = eregi_replace("<ol[^>]*>","<ol>", $data_item);
$data_item = eregi_replace("<li[^>]*>","<li>", $data_item);

$data_item = preg_replace("/<a([^>]*)( href=\S+)([^>]*)>/i", '<a$2 rel="nofollow">', $data_item);

(Ben sadece herhangi undesireables dışarı şerit olarak önce bu HTML etiketleri bir alt ayrıştırmak gerekir).

1 Cevap

Neden herhangi bir etiketi maç olacak genel bir düzenli ifade kullanın ve ardından preg_replace_callback() to allow you to determine what a given tag should be replaced with? That way you can have a simple function that checks to see if the matched tag was an a etiketi, ve eğer öyleyse, href değiştirin, ama aksi takdirde her şeyi değiştirmek değil.

Alternatif olarak, böyle bir şey yapabilirsiniz:

$data_item = preg_replace("/<(p|h2|h3|h4|h5|h6|ul|ol)[^>]*>/i","<$1>", $dataitem);

Regexdeki () grubu eşleşen etiketin türünü yakalar halinde, | belirtilen etiketlerin herhangi bir maç için "veya" operatör ve {[(2)] } değiştirme metninde desen ilk (ve tek) yakalama grup tarafından eşleşti ne yerine kullanılır.