PHP ile regular expression (regex)
Regular 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.
- Regex101 (Favorim)
- Rubular
- Gethifi Regexp Tool
- RegExr
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: [email protected], [email protected], [email protected]'; preg_match_all($pattern, $content, $results); print_r($results['email']);
Array ( [0] => [email protected] [1] => [email protected] [2] => [email protected] )
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.
- regexlib.com
- Wikipedia
- regular-expressions.info
- 30 dakikalık Regex öğretisi
- Regex için 30 kullanışlı araç
İ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!
Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.
RegEx hakkında türkçe en ayrıntılı makaleyi hazırlamışsın. Eline sağlık teşekkür ederiz.
Anlamayanlar ve anlamamakta ısrar edenler (örn: ben) için başucu eseri olmuş bu
Düzenli ifadelere giriş için çok güzel bir yazı olmuş. Elinize sağlık..
Regex’te sorunlarım çoktu makaleniz çok işime yarayacak teşekkürler 🙂
Çok güzel bir ders olmuş. regex hakkında yeterince iyi değildim biraz daha iyi leştim sanırım.
Güzel bir kaynak olmuş. Anlatım için teşekkürler.
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.
Detaylı bir açıklama olmuş. Emeği geçenlere teşekkürler.
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?
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.
en başarılı Türkçe makale diyebilirim. Zahmet takdire şayan (: Başarılar dilerim. Takipteyim.
mükemmel bir çalışma çok teşekkür ediyorum
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.
Çok teşekkürler 🙂
–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.
teşekkürler, siteme uyguladım 🙂
Ö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
Ben PHP bilmiyorum ama öğrenmek isityorum konunuza baktım gerçekten güzel anlatmışsınız bundan sonra PHP’ide öğreneceğim
Teşekkürler çok işime yarardı yararlı bir bilgi
gayet güzel hazırlanmış. teşekkürler.
Teşekkür ederim. Gayet güzel bilgiler
[…] Php ile regex […]
Teşekkürler. Yazıdan istifade ettim.
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.
([0-9a-zA-Z]+) kullanabilirsin
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.
Bahsettiğin yöntem için şu deseni kullanabilirsin;
Bu kodda ^ kullanarak a-zA-Z0-9 aralığında “olmayan” bir karakter içeriyorsa uyarı vermesini sağladık.
Teşekkürler.
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?
sorun yaşadığınız htaccess kodunu paylaşabilir misiniz?
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.
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?
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”);
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.
Merhaba,
Şurada sizin aradığınıza benzer bir yöntem var gibi; http://stackoverflow.com/a/22241749/910548
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?
Sayfa editörleri yazılan yorumları/soruları okuyor mu?
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…
Bir yöntemi mutlaka olmalı ama burada sanırım yardım edebilecek düzeyde editör yok
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
Sayfa editörleri yazılan yorumları/soruları okuyor mu?
evet 😀
Harika bir yazı olmuş. Tebrikler!
cok güzel bi yazi olmuş ellerinize sağlık
harika bir yazı teşekkürler
Harika bir kaynak oluşturmuşsunuz çok değerli bir konu. emeğiniz için teşekkür ederim.
‘( ‘ ve ‘ )’ parantezlerden sonra ve önce boşluk var. bunu nasıl alabilirim. Yardımcı olur musunuz.
Ör:( Özel Durum Açıklaması (Genel) )
Şunu deneyebilirsin;
( (.+) )
Gerçekten teşekkürler yararlı bir ders olmuş.
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?
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
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.
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?
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
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ı 🙂
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
{{alan ([0-9]+),([0-9]+)}}
Yukarıdaki deseni deneyebilirsin. Test etmek için; http://regexr.com/3d5jc
çok teşekkkürler peki sadece 10,2 yi almaya çalışsak nasıl alırız.
O zaman şu şekilde güncellemelisin
{{alan ([0-9,]+)}}
çok teşekkürler
Merhaba
Harf ve sayı birlikte içeren dediğimizde nasıl yazabiliriz?
Kendim hallettim 🙂
\S*(\S*([a-zA-Z]\S*[0-9])|([0-9]\S*[a-zA-Z]))\S*
25 ile 80 arası rastgele sayıların atandığı bir dizi nasıl oluştururuz
Bu kadar yalın ve güzel anlatılır.Emeğinize sağlık.
özel karakter olarak ? içeren nasıl diyebiliriz?
BEYLER EĞİTİMLER ÇOK FAYDALI. BU ARADA YOUTUBE “İŞSİZ KAĞIT” KANALINA BEKLİYORUM…
aramalarda tembel ve açgözlü arama türleri de var. konuda göremedim ama
https://stackoverflow.com/questions/2301285/what-do-lazy-and-greedy-mean-in-the-context-of-regular-expressions