RSS

PHP ile regular expression (regex)

65 11 Ağustos 2013 ~ Musa Avcı — İleri

RegexRegular expression (regex) Türkçesiyle düzenli ifadeler metinlerde bir biçimsel dil kullanarak tarif edilen kısımları seçip ayırmamıza yarayan bir programdır.

Neredeyse bütün programlama dillerinde kullanılan regex ile metinlerde ayrıştırmak istediğiniz her şeye ulaşabilirsiniz.

Örneğin günümüzde en çok içerik çalma botlarında kullanılır. Fakat yazı düzeni sağlamak ya da metinlerde aranan ifadelere ulaşıp onları manipüle etmek için de kullanabilirsiniz.

Bu yazıda öncelikle regex desenlerini denemek için bir kaç kullanışlı site paylaşacağım, sonrasında temel ihtiyaçları karşılayacak ve en çok kullanılan regex desenlerinden ve bunları PHP ile nasıl kullanacağımızdan bahsetmeye çalışacağım.

Giriş

Yazı boyunca göstereceğim desenleri deneyebilmek için anlık işlemler yapabilen ve her regex çalışmamızda tarayıcımızın bir tabında açık olması gereken bu siteleri mutlaka yer imlerinize ekleyin.

Hoşumuza giden bir tanesini açın ve verilen örnekleri canlı bir şekilde deneyerek daha iyi kavrayın.

Bir kelime aramak

Regex ile yapılabileğimiz en basit işlem kelime aramaktır, bunun için direkt aramak istediğimiz kelimeyi yazmak yeterli. Örnek olarak düzenli ifademize “elma” yazıyoruz. Ve elde edeceğimiz sonuçta elma kelimelerinin seçildiğini görebilirsiniz.

Örnek düzenli ifade:

elma

Metin ve sonuç:

Bu deneme amaçlı yazılmış ve içerisinde elma geçen öylesine bir metin.

Yukarıda sarı renkle işaret edilen kelime, yazdığımız ifadenin yakaladığı kelimenin göstergesidir. Bundan sonraki örneklerde de elde ettiğimiz sonuçları böyle göstereceğim.

Özel karakterler

Düzenli ifadelerde bolca anlam ve ifade içeren özel karakterler vardır. Asıl yapmak istediklerimizi bunlarla ifade edip istenilen sonuca ulaşırız. Öncelikle bu karakterlerin ne olduklarına bakalım, sonrasında da nasıl kullanıldıklarını örnekler ile deneyelim.

Düzenli ifadelerde kullanılan özel karakterler:

Karakter Açıklaması
d Herhangi bir rakamı ifade eder
. Satır başı hariç herhangi bir karakteri ifade eder
w Herhangi bir harfi, rakamı veya alt tireyi ifade eder
s Herhangi bir görünmez karakteri ve boşluğu ifade eder. (Boşluk, tab, satır başı gibi)
^ Başlangıcı ifade eder
$ Sonu ifade eder
* Kendinden önce yazılmış karakterin;
sıfır veya daha fazla tekrar etmesini ifade eder
+ Kendinden önce yazılmış karakterin;
bir veya daha fazla tekrar etmesini ifade eder
? Kendinden önce yazılmış karakterin;
olsa da olur olmasa da olurunu ifade eder
{123} Kendinden önce yazılmış karakterin;
parantez içerisine yazılan sayı kadar tekrar etmesini ifade eder
{1, 2} Kendinden önce yazılmış karakterin;
parantez içerisinde yazılan iki sayı arasında tekrar etmesini ifade eder
( … ) Parantez içerisine yazılan ifadeleri gruplamaya yarar
( … | … ) Parantez içerisine yazılan “|” dik tire işareti ya da anlamına gelir, içerisine yazılan ve dik tire ile ayrılan ifadelerden herhangi birisinin eşleşmesini ifade eder
[ … ] Köşeli parantez içerisine yazılan karakterlerden bir tanesini ifade eder
Kaçış karakteri. Yukarıda yazdığımız karakterleri normal olarak yazmak istediğimizde başına kaçış işaretini koyarız. Örneğin noktayı ifade etmek için .
D Rakam olmayan herhangi bir karakteri ifade eder
S Görünmez ve boşluk olmayan karakteri ifade eder
W Harf, rakam veya alt tire olmayan karakteri ifade eder
b Kelimenin başını veya sonunu ifade eder
[^ … ] Üç nokta yerine yazılan karakterler haricindeki karakterleri ifade eder
[a-z] A dan z’ye olan harflerden birisini ifade eder

Regex ayarları

Regex desenleri iki “/” (bölü) işaretinin arasına yazılır. Sondaki bölü işaretinden sonra isteğe bağlı olarak regex ayar karakterleri girilir.

Ayar karaktleri:

Karakter Açıklaması
i Büyük küçük harfe duyarsız olur
g İlk eşleşmede durmaz, kapsamlı tarama yapar
s Satır başı hariç her şeyi ifade eden nokta karakterinin satır başını da ifade etmesini sağlar
m ^ ve $ karakterlerinin her satırın başını ve sonunu ifade etmesini sağlar

Örnek kullanımı:

/elma/i

Bu örnekte büyük ELMA, küçük elma ya da ElMa şeklinde yazılanları da büyük küçük harfe aldırmadan yakalar.

Yukarıdaki örnek selma, elmas gibi kelimelerin içerisindeki “elma”ları da bulacaktır. Eğer sadece elma kelimesini aramak istiyorsak kelime başı ve sonunu ifade eden b kullanacağız.

/belmab/gi

Şimdi sadece elma kelimesini bulacağız, selma, elmas gibi diğer elma içeren kelimeleri yakalamayacaktır.

Sayıları yakalamak

Gelelim şimdi yukarıdaki tabloda listelediğimiz karakterlerin örnek kullanımına. Girilen içerikte sadece sayıları bulmak için “d” ve “+” karakterlerini kullanacağız.

/d+/g

Bu örnek sadece 1234, 321 789 sayılarla eşleşir. “g” ayarı ile de bir kere değil kapsamlı aramasını ifade ettik

Bir veya daha fazla tekrarı ifade eden “+” karakterinin başına herhangi bir rakamı ifade eden “d” yazdık. Daha işe yarar bir örnek için girilen içerikteki tarih formatında yazılmış ifadeyi yakalayalım.

/(d{2}.d{2}.d{4})/g

İfadenin karışık görünmesi sizi korkutmasın, ilgili yerlerden inceleyerek ayıkladığınızda ne olduğunu daha rahat özetleyebilirsiniz. d{2} 2 rakamı, sonrasında . kaçış karakteri ile noktayı, son kısımda ise 4 rakamı ifade ettik. Böylece 10.08.2013 gibi bir içerikle eşleşecektir.

Kelimeleri yakalamak

Yukarıdaki örnekle benzer bir ifade ile yapabiliriz.

/(w+)/g

w ifadesi herhangi bir harfi ifade ettiğini söylemiştik fakat Türkçe karakterlerin bu ifade için istisna olduğunu bilmeniz gerekiyor. Eğer Türkçe bir içerikle çalışıyorsak yapmamız gereken ifade şöyle olmalı;

/([a-zA-ZÇŞĞÜÖİçşğüöı]+)/g

Bu ifade ile Türkçe kelimeleri de yakalayabiliriz

Küçük ve büyük a’dan z’ye harlerin yanına Türkçe’de olan küçük ve büyük harfleri ekledik. Bir diğer örnek olarak da içerikten sadece istenilen bir kelimeyi almayı deneyelim.

/benim adım (w+)/gi

Merhabalar benim adım Musa!

Başlangıç ve sona göre yakalama

^ ve $ karakterleriyle başının ya da sonunun nasıl olacağını ifade edebiliriz. Örnek olarak sadece selam ile başlayan içeriği ayıklamayı deneyelim.

/^selam/

Bu örnek metin selam ile başlamadığı için hiç bir şeyle eşleşmeyecektir

selam! bu örnek daha samimi olduğu için eşleşecektir

Selam ile başlayan ve hoşçakal ile biten metnin arasında geçenleri yakalayacak bir örnek daha;

/^selam(.+)hoşçakal$/

selam buralar yakalanacak hoşçakal

Düzenli ifadeleri PHP ile kullanmak

Gelelim bu faydalı işlemleri PHP üzerinde kullanmaya. Bunun için bir kaç faydalı fonksiyon ile tanışacağız.

İfadenin eşleşip eşleşmediğini kontrol etmek

preg_match fonksiyonu ile yazdığımız ifadenin verdiğimiz içerikle eşleşmediğini kontrol edebiliyoruz. Örnekte girdinin geçerli bir saat formatı olup olmadığını kontrol edeceğiz.


$pattern= '/^([01][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9]$/';
$content = '23:15:59';

if(preg_match($pattern, $content))
{
    echo 'Doğru bir saat girilmiş';
}
else
{
    echo 'Yanlış bir saat formatı girilmiş';
}

Eğer ifade metin içerisinde eşleşirse true aksi halde false döner.

Yazdığımız ifadenin açıklamasını da merak ediyorsanız;
Öncelikle ^ ile metnin başını ifade ettik, yani tam olarak bizim istediğimiz gibi başlamalı. Sonunda da $ kullandık, bu sayede tam olarak bizim istediğimiz başlangıca ve sona sahip olan bir içeriği aradığımızı ifade ettik.

Sonrasında ([01][0-9]|[2][0-3]) 2 ifadeyi gruplandırdık. Çünkü saat ya 01 den 19’a kadar ya da 20 dan 23’e kadar olabilir. Eğer [0-9]{2} şeklinde 0 ile 9 arasında 2 sayı ile eşleş deseydik, 99 gibi 23’den büyük sayılara da eşleşirdi.

Yakalanan içerikleri almak

Düzenli ifadelerde yakalamak ve ayırmak istediğimiz içeriklerin ifadelerini parantez içerisinde yazarız. Parantez içerisine yazılan ifadelere eşleşen içeriklere preg_match_all fonksiyonu sayesinde ulaşacağız. Bu fonksiyon tüm içeriği taramasını sağlayan “g” ayarını içerir, yani preg_match_all kullanırken “g” (global) ayarını yazmanıza gerek yok.

Teorik bilgi ve örneklerin haricinde biraz gerçek hayattaki kullanımlarına bakarak daha iyi kavrayabileceğimizi düşünüyorum. Bir sitenin kayak kodundan title etiketi arasında yer alan site başlığını yakalamak için şöyle bir ifade yazabiliriz.

$pattern = '/<title>(.+)</title>/i';
$content = file_get_contents('//www.phpr.org');

preg_match_all($pattern, $content, $results);

print_r($results);

Ekran çıktısı şöyle olacaktır;

Array
(
    [0] => Array
        (
            [0] => <title>php serüvenleri - PHP dersleri, PHP örnekleri, PHP kodları</title>
        )

    [1] => Array
        (
            [0] => php serüvenleri - PHP dersleri, PHP örnekleri, PHP kodları
        )
)

$results değişkenindeki dizinin ilk elemanı; girilen ifade ile eşleşen içeriklerin dizisini verir. Sonraki elemanları ise parantezler ile grupladığımız ifadelere eşleşen içeriklerin dizisini verir. Yani bizim asıl ihtiyacımız olan title etiketleri arasında parantez içerisine aldığımız karakterleri almak için 2. elemana bakacağız.

İkinci elemanda kendi içerisinde bir dizi, yani eğer birden fazla eşleşme olursa onları da sırayla verecektir.

Düzenli ifadeleri kullanarak içeriği değiştirme

Yine kullanışlı bir örnek ile açıklayalım. Girilen metin içerisine düz bir şekilde yazılan URL’leri HTML formatında link yapalım. Bunun için öncelikle bir URL’yi ifade edecek olan desen lazım. Ben internette hazır örneklerden birisini seçtim, dilerseniz siz de diğerlerine şuradaki adresten bakabilirsiniz. preg_replace fonksiyonu ile eşleşen ifadelerde yine parantez içinde grupladığımız ifadeleri istediğimiz şekilde değiştirebiliriz.

// URL'leri yakalayan desen
$pattern = '(https?://(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?.)+[a-zA-Z]{2,6}/?[^bs]+))';

$content = 'Diğer PHP serüvenlerine //www.phpr.org adresinden bakabilirsiniz';

$replace = '<a href="$0">$1</a>';

echo preg_replace($pattern, $replace, $content); 

Ekranda düz yazı ile yazdığımız URL’nin link olmuş hali yazar;

Diğer PHP serüvenlerine www.phpr.org adresinden bakabilirsiniz

Daha fazlası

İfade gruplarını yakalamamak

Yukarıda özellikle yakalamak istediğimiz ifadeleri parantez içine almamız gerektiğini söylemiştim. Fakat her parantez içine aldığımızı yakalamak istemeyebiliriz. Bunun için parantezleri (?: ... ) şeklinde kullanabiliriz.

Böylece bu parantezin yakaladığı içerik sadece çalışırken kullanılır, sonuçta gösterilmez.

/(w+@w+(?:.w+)+)/

E-mail adresini ifade eden desende iki grubumuz var, fakat içerideki grubu sonuçta almamıza gerek yok. İfadeyi çalıştırdığımızda sadece mail adreslerini veren bir dizimiz olacak.

İfade gruplarını isimlendirme

Yukarıdaki örnekte gereksiz parantezleri almayıp elde ettiğimiz sonucu biraz daha düzene sokmuş olduk. Şimdi ise bu gruba isim vererek daha da düzeni sağlayabiliriz.

Grupları /(?<grupismi>ifade)/ şeklinde isimlendirebilirsiniz.

$pattern = '/(?<email>w+@w+(?:.w+)+)/i';
$content = 'Bir kaç adres: elma@manav.com, yarimkilo@kasap.com, ates@askeriye.com';

preg_match_all($pattern, $content, $results);

print_r($results['email']);
Array
(
    [0] => elma@manav.com
    [1] => yarimkilo@kasap.com
    [2] => ates@askeriye.com
)

Hiç dizi elemanlarının hangisi benim ihtiyacım olandı diye uğraşmadan direkt isim verdiğimiz grubun yakaladığı içeriklere ulaşabiliriz.

Hava durumu

Yine pratik bir örnek ile meteoroloji sitesinden İstanbul için günlük hava durumunu yakalayan bir desen hazırlayalım. Bu tür işlerin püf noktası aradığımız içeriği çevreleyen eşsiz desenleri görmek.

İstanbul için günlük hava durumunu veren sayfa;
http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL

Sayfanın kaynağını açıp aradığımız sıcaklığın hangi HTML etiketleri arasında olduğuna bakıyoruz.

$content = file_get_contents('http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL');

// Derece
preg_match_all('/<em class="renkMin zemimeZ">(.+)C</em></td>/si', $content, $results);
// İlk eşleşeni alıyoruz
$degree = $results[1][0];

// Hava durumunun ikonu ve açıklaması
preg_match_all('/"([wÇŞİĞÜÖöçşğüı ]+)" rowspan="2"><img src="..([w/.-]+)"/si', $content, $results);
$description = $results[1][0];
$image = 'http://www.mgm.gov.tr' . $results[2][0];

echo $degree . ' ' . $description;
echo '<img src="' . $image . '" />';

Ekranda hava durumunu görürüz.

Daha yeni başlıyoruz

Aşağıdaki faydalı kaynakları da inceleyip kurcalamanızı öneriyorum.

İlerleyen zamanlarda fırsat buldukça yeni örnekler eklemeye devam ederim, fakat şimdilik bu kadar. Uzun bir yazı oldu ama neresinden dalarsanız dalın faydalanabileceğinizi düşünüyorum. Ben de yazıyı hazırlarken bir çok yeni şey öğrendim bu nedenle size teşekkür ediyorum.
(bkz: kazan kazan)

Konu hakkında aklınıza takılan, sormak istediğiniz ya da nasıl yaparım dediğiniz şeyleri yorum yazarak sormaktan çekinmeyin.

Bir başka PHP serüveninde görüşmek üzere kendinize iyi bakın!

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP ile regular expression (regex)" yazısı için 65 yorum yapılmış.

  1. Ali Görkem dedi ki:

    RegEx hakkında türkçe en ayrıntılı makaleyi hazırlamışsın. Eline sağlık teşekkür ederiz.

  2. Özcan ESEN dedi ki:

    Anlamayanlar ve anlamamakta ısrar edenler (örn: ben) için başucu eseri olmuş bu

  3. Mustafa EMEK dedi ki:

    Düzenli ifadelere giriş için çok güzel bir yazı olmuş. Elinize sağlık..

  4. Enes dedi ki:

    Regex’te sorunlarım çoktu makaleniz çok işime yarayacak teşekkürler 🙂

  5. Savaş Can Altun dedi ki:

    Çok güzel bir ders olmuş. regex hakkında yeterince iyi değildim biraz daha iyi leştim sanırım.

  6. Harun dedi ki:

    Güzel bir kaynak olmuş. Anlatım için teşekkürler.

  7. emre dedi ki:

    preg_match fonksiyonlarının nasıl kullanılacağına dair anlaşılır bir kaynak bulamıyordum ne zamandır. Gerçekten çok faydalı oldu. Emeğine sağlık.

  8. yonja dedi ki:

    Detaylı bir açıklama olmuş. Emeği geçenlere teşekkürler.

  9. yigit dedi ki:

    belmab regexi şu cümlede:
    selma, belma ve kelamet gibi elma içeren kelimeleri kontrol edelim mi?
    sadece “gibi” kelimesinden sonraki normal yazılmış olan elmayı buluyor flagları da aynı sizin gibi gi vermeme rağmen, sorun nedir acaba?

  10. yigit dedi ki:

    tamam, olayı yanlıs anlamısım, ben sanıyorum ki selma yazısının icindeki elmayı da seçicek renkli göstericek:) anladım simdi, teşekkür.

  11. Fatih Toprak dedi ki:

    en başarılı Türkçe makale diyebilirim. Zahmet takdire şayan (: Başarılar dilerim. Takipteyim.

  12. evden eve nakliyat dedi ki:

    mükemmel bir çalışma çok teşekkür ediyorum

  13. Mustafa dedi ki:

    PHP’de Türkçe kaynak sıkıntısı çekilen konularda çalışma yapmanız takdire şayan, teşekkür eder devamını bekleriz.

  14. ibrahim dedi ki:

    Çok teşekkürler 🙂

  15. Kanber dedi ki:

    –Köşeli parantez içerisine yazılan karakterlerden bir tanesini ifade eder–
    peki 100bin satır olan sütundan (kelimeler) seçim yapacağız. ama SADECEköşeli parantez içindeki harfleri içeren satırlar getirilecek.
    Köşeli parantez içinde olmayan satırlar gösterilmeyecek.

  16. murat dedi ki:

    teşekkürler, siteme uyguladım 🙂

  17. isa dedi ki:

    Örneğin günümüzde en çok içerik çalma botlarında kullanılır. Fakat yazı düzeni sağlamak ya da metinlerde aranan ifadelere ulaşıp onları manipüle etmek için de kullanabilirsiniz.
    bu işime yarayacaktır aradıgım yazıyı burada buldum tşk

  18. gulet kiralama dedi ki:

    Ben PHP bilmiyorum ama öğrenmek isityorum konunuza baktım gerçekten güzel anlatmışsınız bundan sonra PHP’ide öğreneceğim

  19. Güncel dedi ki:

    Teşekkürler çok işime yarardı yararlı bir bilgi

  20. nurullah okatan dedi ki:

    gayet güzel hazırlanmış. teşekkürler.

  21. Hakan dedi ki:

    Teşekkür ederim. Gayet güzel bilgiler

  22. Dilara dedi ki:

    Teşekkürler. Yazıdan istifade ettim.

  23. Mehmet dedi ki:

    Merhaba,

    Öncelikle çok yararlı bir makale olmuş emeğinize sağlık. Bir sorum olacaktı bir formda girilen metnin sadece a-z, 0-1, içerip içermediğinin kontrolünü nasıl sağlayabiliriz. Sadece harf ve rakam içerip içermediğini kontrol edicez. Teşekkürler.

    • Musa Avcı dedi ki:

      ([0-9a-zA-Z]+) kullanabilirsin

      • Mehmet dedi ki:

        Bilginiz için teşekkürler fakat bir sorun yaşıyorum. İlk mesajımda belirtmeyi unutmuşum özür dilerim. Bir metin kutusuna girilen metnin if ve preg_match ile sadece sayı, harf içerip içermediğini kontrol etmek istiyorum yani *,-,^ gibi tüm özel karakterleri içerip içermediğinin kontrolünü sağlamaya çalışıyorum. Verdiğiniz kodu ben kullanamamışda olabilirim. Teşekkürler.

        • Musa Avcı dedi ki:

          Bahsettiğin yöntem için şu deseni kullanabilirsin;

          $input = 'Selam bu bir deneme';
          if (preg_match('/[^a-zA-Z0-9]/', $input))
          	echo 'Lütfen özel karakterler kullanmayınız';
          

          Bu kodda ^ kullanarak a-zA-Z0-9 aralığında “olmayan” bir karakter içeriyorsa uyarı vermesini sağladık.

  24. Ramazan dedi ki:

    Detaylı bir açıklama olmuş emeğinize sağlık. htaccess ile problemim var yardımcı olabilir misiniz?

    kategoriler/ayakkabi/spor-ayakkabi

    Seo = ayakkabi/spor-ayakkabi

    Aradaki / işaretini özel olarak algılamasını istemiyorum ama özel sanıp sadece ayakkabı değerini alıyor. htaccess te nasıl bir düzenleme yapabilirim?

    • Musa Avcı dedi ki:

      sorun yaşadığınız htaccess kodunu paylaşabilir misiniz?

      • Ramazan dedi ki:

        RewriteRule kategoriler/([^/]*) index.php?func=Products&SeoName=$1 [NC,L]

        Link : http://www.site.com/ayakkabi/spor-ayakkabi

        TABLE YAPISI

        ID, Name SeoName
        1 Ayakkabı ayakkabi
        2 Spor Ayakkabı ayakkabi/spor-ayakkabi

        SeoName = ayakkabi/spor-ayakkabi

        Yani SeoName Alanım Bu Şekilde “ayakkabi/spor-ayakkabi” Buradaki / İşaretini Özel Olarak Algılıyor. $_GET[‘SeoName’] İle Değerini Almak İstediğimde Sadece “ayakkabi” Geliyor Bu da Benim İşime Yaramıyor. Ama / İşaretini Özel Olarak Algılamazsa İstediğim Olacak Gibi Yardımlarınız İçin Teşekkür Ederim.

  25. Atilla dedi ki:

    http://index.havaizleme.gov.tr/Map/StationInfo/17
    Antalya’nın Hava Kalitesini çekmek istiyorum ama sanırım site veri çekmeye izin vermiyor kullandığım kod

    BU SORUNU NASIL AŞABİLİRİM?

  26. Atilla dedi ki:

    function request($url){
    // The actual curl request.
    $curl_timeout = 5;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $curl_timeout);
    curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13’);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
    }
    echo request(“http://index.havaizleme.gov.tr/Map/StationInfo/17”);

  27. Bilal dedi ki:

    Merhaba @Musa Avcı;
    mysql_query("SELECT * FROM tablo WHERE isim REGEXP '^[OÖ]' ORDER BY id");
    Yukarıdaki kodda isim değeri ö veya o ile başlayan verileri çekiyorum. Fakat php sadece ö ve o yu değil ç yi de çekiyor. Yani isim değeri ö, o ve ç olanları çekiyor bu sorgu. Sadece ö ve o harfleriyle başlayanları çekmesini istiyorum. Nasıl yapabilirim ? Teşekkürler.

  28. Atilla dedi ki:

    http://index.havaizleme.gov.tr/Map/StationInfo/17
    Antalya’nın Hava Kalitesini çekmek istiyorum ama sanırım site veri çekmeye izin vermiyor kullandığım kod;

    function request($url){
    // The actual curl request.
    $curl_timeout = 5;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $curl_timeout);
    curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13′);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
    }
    echo request(“http://index.havaizleme.gov.tr/Map/StationInfo/17”);

    Mutlaka bir yöntemi yolu olmalı
    BU KONUDA YARDIMCI OLACAK KİMSE YOK MU?

  29. Atilla dedi ki:

    Sayfa editörleri yazılan yorumları/soruları okuyor mu?

  30. Atilla dedi ki:

    Sayın Musa Avcı “Hava Kalitesi” ile ilgili soruma sizden bana cevap olarak E-Posta geldi ama sonra geri dönüş olmadı sanırım siz de bu sorunu çözemediniz…

  31. Atilla dedi ki:

    Bir yöntemi mutlaka olmalı ama burada sanırım yardım edebilecek düzeyde editör yok

  32. Yaşar Çokver dedi ki:

    preg_match ile alınan sonucu değişkene atadığımızda sadece bir kez kullanılıyor ikinci kez kullanılamıyor. ve hatta veritabanı bağlantısında hiç kullanılamıyor. Bunun çözümü ne olabilir acaba.
    <?php
    $icerik = ("”);
    $aranan=preg_match (“/(.*)/”,$icerik,$sonuc);
    $deger = $sonuc[0];
    $ihale = mysql_fetch_array(mysql_query(“select * from ihale WHERE parsel_id = ‘$deger'”));
    {
    ?>
    Şu kullanımda div id değerini $deger değişkenine atıyor ama veritabanı bağlantısında kullanmıyor. Çok uzun değilse bir çözüm önerebilirmisiniz acaba. (Not: genel_parsel_id değeri her sayfaya göre değişen bir değişkendir. Örn 126 ya da 158

  33. plastik badyalar dedi ki:

    Sayfa editörleri yazılan yorumları/soruları okuyor mu?

  34. Nuri Akman dedi ki:

    Harika bir yazı olmuş. Tebrikler!

  35. Müzik haberleri dedi ki:

    cok güzel bi yazi olmuş ellerinize sağlık

  36. Bora U. dedi ki:

    harika bir yazı teşekkürler

  37. Harika bir kaynak oluşturmuşsunuz çok değerli bir konu. emeğiniz için teşekkür ederim.

  38. Dilan dedi ki:

    ‘( ‘ ve ‘ )’ parantezlerden sonra ve önce boşluk var. bunu nasıl alabilirim. Yardımcı olur musunuz.
    Ör:( Özel Durum Açıklaması (Genel) )

  39. Kutalp Sevilen dedi ki:

    Gerçekten teşekkürler yararlı bir ders olmuş.

  40. Halil İbrahim Yağmur dedi ki:

    Merhaba, çok faydalı bir anlatım. Ben de mysql sorgusunda takıldım. Tam eşleşme yaptırmak için ne yapmalıyız?

    Tabloda kayıtlı olan; 1,10,12
    Benim aradığım: 1

    $yeni_urun_sql = $db->prepare(“SELECT * FROM ilanlar
    WHERE
    ilan_yayin = ‘1’ AND
    ilan_filtre = ‘1’ AND
    ilan_kat_dizi REGEXP ‘$id'”);
    $yeni_urun_sql->execute();
    Burada sadece 1 in bulunmasını istiyuorum? NAsıl olabilir?

    • Musa Avcı dedi ki:

      Böyle bir amaç için regex kullanmak yerine veritabanında kategori ve ilan ilişkisi kuracağınız bir tablo daha açmanız gerekiyor. Şema örneği;

      İlanlar tablosu:
      id, baslik, …

      Kategoriler tablosu:
      id, baslik, …

      İlan kategorilerini saklayacağın tablo:
      kategori_id, ilan_id

      • Halil İbrahim Yağmur dedi ki:

        Cevap için teşekkür ederim. Buradaki amaç kategori ağacına göre ürün listelemek. Mesela,
        1 nolu id: elektronik
        10 nolu id: bilgisayarlar
        12 nolu id: notebooklar

        Ben ürünü notebooklar kategorisine ekliyorum ve kategori ağacını da, “1, 10, 12,” şeklinde dizi olarak ilan_kat_dizi alanına kaydediyorum.
        Elektronik kategorisine girince, alt ürün olduğundan 12. kategoride bulunan üründe ekrana geliyor. Asl yapmaya çalıştığım budur.

      • Halil İbrahim Yağmur dedi ki:

        Yukarıda ilk verdiğim örnekte, get ile gelen id 2 ise, o zaman 12 yi de buluyor en son çare regexp olarak denemek kaldı? Mümkün müdür?

      • Musa Avcı dedi ki:

        Yine de regex bu işlem için ideal bir çözüm değil. Bu işlem için de parent_id kullanmalısın. Örneğin;

        id: 1, baslik: elektronik, parent_id: 0 (ana kategori)
        id: 2, baslik: bilgisayar, parent_id: 1
        id: 3, baslik: notebook, parent_id: 2
        id: 4, baslik: masaüstü, parent_id: 2

        Bu şekilde birisi masaüstü kategorisine basınca id’si 4 olan ilanlar listelenecek. Eğer elektronik kategorisine gelirse de id’si 1 olan ve recursive şekilde parent_id’si bir üstü olacak şekilde kapsayan tüm diğer kategori id’lerini içeren ilanlar listelenecek

        • Halil İbrahim Yağmur dedi ki:

          Zaten alanlarım bu şekilde.
          kat_id | kat_adi | kat_ustid

          İlanlarımı eklerken ilan kategorisini de ekliyorum. Peki sorgu nasıl olmalı? Bence bu iş regex ile daha basit çözülecek gibi duruyor. Çünkü, dizi içerisinde eşleştirmeyi de yapabilirsem sistem sorunsuz çalışacak. Birtek bu eşleştirme kaldı 🙂

  41. Regex dedi ki:

    Bir metinin içinde {{alan 10,2}} bu gibi birden fazla yerin olduğunu varsayarsak 10,2 ifadelerini tüm içerikten nasıl alabiliriz

  42. Yüksel A dedi ki:

    Merhaba
    Harf ve sayı birlikte içeren dediğimizde nasıl yazabiliriz?

  43. egmyo dedi ki:

    25 ile 80 arası rastgele sayıların atandığı bir dizi nasıl oluştururuz

  44. danaci dedi ki:

    Bu kadar yalın ve güzel anlatılır.Emeğinize sağlık.

  45. Fırat dedi ki:

    özel karakter olarak ? içeren nasıl diyebiliriz?

Bir Cevap Yazın

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