PHP ile Content Bot yaparken preg_match_all içerisinde birden fazla pattern kullanımı

Standard

Merhaba Arkadaşlar;

Bir site üzerinden curl kullanarak bot yapmak herkesin malumu kolay bir işlem; ama ya birden fazla pattern ihtiyacı duyarsanız?


<ul><li><span>ürün 1</span></li><li><span>ürün 2</span></li><li><span>ürün 3</span></li></ul>

Yukarıdaki içerik için aşağıdaki pattern doğru olacaktır;

#<li><span>(.*?)</span></li>#

ancak

<ul><li><span>ürün 1</span></li><li><div>indirimde</div><span>ürün 2</span></li><li><span>ürün 3</span></li></ul>

gibi bir eleman ile karşılaştığında preg_match_all çalışmayı durduracak bu satıra gelene kadar aldıklarını döndürecektir. Peki bu durumda ne yapacağız?

Şu anda elimizde iki adet pattern var. Ya ilki ya da ikincisi ile eşleşenleri listelemek istiyoruz. Bunu şöyle düşünün; veri 1 ya da 2 ye eşit ise işlemi gerçekleştir şeklinde bir if bloğumuz var. Kısaca OR operatörü kullanacağız. preg_match_all içerisinde OR operatörü kullanımı için patternlar arasında | (düz çizgi) kullanacağız.

Aşağıdaki örnek kod satırı sorunu çözmüş olacaktır.


preg_match_all('#<li><span>(.*?)</span>|<div>indirimde</div><span>(.*?)</span></li>#',$pattern,$arrRet);
print_r($arrRet);

Çıktı aşağıdaki gibi olacaktır.

Array
(
[0] => Array
(
[0] =>
ürün 1
[1] =>
indirimde
ürün 2

[2] =>
ürün 3
)

[1] => Array
(
[0] => ürün 1
[1] =>
[2] => ürün 3
)

[2] => Array
(
[0] =>
[1] => ürün 2
[2] =>
)

)

Burada çıktı dizisinin birinci ve ikinci indislerinde ki puzzle vari çıktı yapısını farketmişsinizdir. Birinci patterna uyan verileri 1 numaralı indiste, “|” ile ifade ettiğimiz or operatörü ile belirttiğimiz ikinci patterna uyan veriler 2 numaralı indiste listelenmiş durumda.

Umarım işinize yarar, iyi çalışmalar…