Php’de Element Sınıfına (class) Göre Html Parçalama

php programlama dili

Bir web sitesinden file_get_contents ya da curl ile aldığınız html kodlarını parçalayıp belirli bir alanı almak gerektiğinde bir kaç yöntem var. Geleneksel parçala böl işlemlerinden ziyade, bu yazıda daha efektif bir fonksiyon ile element sınıfına(class) göre html parçalama işlemi gerçekleştireceğiz.

Html stringi parçalamak için geleneksel yollarla explode edebilirsiniz ya da regular expression yazabilirsiniz. Explode yönteminde başlangıç ve bitiş için benzersiz(unique) bir element bulmalısınız ki tam istediğiniz bölgeyi alabilesiniz. Bu çoğu zaman ya olmuyor, ya da birden fazla parçalama yaparak (önce en dış container’i, sonra bir içtekini vs..) almak gerekiyor. Regular expression yönteminde ise iç içe geçmiş bir çok div olduğu bir senaryoda bir div’in başlangıç ve bitişini  yakalayacak expression yazmak gerçekten çok zor. Bu aşamada DOMDocument sınıfı devreye giriyor. Php’de element sınıfına(class) göre html parçalama olayını kolaylaştırıyor.

DOMDocument içerisinde en sık kullanacağınız 2 method var:

  • getElementsById *
  • getElementsByTagName *

Eğer id ya da direk html elementi ile alacaksanız kolay, fakat sınıfa göre alacaksanız dahili getElementsByClassName diye bir fonksiyon yok. Yoksa biz yazalım;

function getElementsByClassName($classname, $html = null, $index = null) {
		
    $dom = new DOMDocument;
    libxml_use_internal_errors(true);
    $dom->loadHTML($html);

    $finder = new DomXPath($dom);
   
    $node = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' ".$classname." ')]");

    if($index !== null ) {
    	return $dom->saveHTML($node[$index]);
    }
    $array = array();

    for ($i=0; $i < count($node); $i++) { 
    	$array[] = $dom->saveHTML($node[$i]);
    }
    return $array;
}

Ne yaptık:

  • Yeni bir domdocument oluşturduk ve fonksiyona parametre olarak gödnerilen $html değişkenini dom nesnesine yükledik
  • Yeni bir dom query’si oluşturduk ve sınıfı $classname olan html taglarını süzdük
  • Eğer $index diye bir parametre geldi ise; bulunan sonuçlardan $index numaralıyı döndürdük, gelmediyse tüm bulunan değerleri bir array’a atıp fonksiyonu döndürdük.

Örnek kullanumı ise;

$html = @'<div class="test">
	test içeriği
	<div class="test2">
		test 2 içeriği
		<div class="test3">
			test 3 içeriği
		</div>
	</div>
</div>';


$sonuc = getElementsByClassName("test2",$html,0); 
echo $sonuc;

/* çıktısı : 
test 2 içeriği
	<div class="test3">
		test 3 içeriği
	</div>
*/

Basitçe bir fonksiyon oluşturduk ve Php‘de element sınıfına(class) göre html parçalama olayını çözmüş olduk.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir