14 Haziran 2007 Perşembe

PHP ile Düzenli İfadeler (Regex)

Merhaba Webkolog ailesi!

Web geliştirme sürecinde metin verileriyle çalışmak kaçınılmazdır. E-posta adreslerini doğrulamaktan URL'leri ayrıştırmaya, belirli desenlere sahip metinleri bulmaktan karmaşık içerik değişimleri yapmaya kadar pek çok senaryoda düzenli ifadeler (Regular Expressions - Regex) imdadımıza yetişir. PHP, bu güçlü metin işleme aracını kullanabilmemiz için zengin bir dizi fonksiyona sahiptir. Düzenli ifadeler başlangıçta biraz karmaşık gelebilir, ancak bir kez mantığını kavradığınızda, metin manipülasyonunda ne kadar etkili olduklarını göreceksiniz. Hadi gelin, bu büyülü dünyaya birlikte adım atalım!


Düzenli İfadeler Nedir?

Düzenli ifadeler, metin içinde belirli desenleri tanımlamak ve eşleştirmek için kullanılan özel karakter dizileridir. Bir dildeki gramer kurallarına benzer şekilde, düzenli ifadeler de metinlerin yapısını tanımlayan bir "kalıp" oluşturur. PHP'de düzenli ifade fonksiyonları genellikle PCRE (Perl Compatible Regular Expressions) kütüphanesini kullanır ve fonksiyon isimleri preg_ önekiyle başlar.


1. Arama ve Eşleştirme: preg_match() ve preg_match_all()

Metin içinde bir deseni aramak ve bulmak en temel düzenli ifade işlemlerindendir. Tek bir eşleşme veya tüm eşleşmeleri bulmak için farklı fonksiyonlar kullanırız.


<?php
$metin = "Telefon numaram: 0555 123 45 67, diğer numaram: 0532-987-65-43.";

// Sadece ilk eşleşmeyi bulur: preg_match()
// Desen: /0[0-9]{3}[\s-][0-9]{3}[\s-][0-9]{2}[\s-][0-9]{2}/
// Açıklama: 0 ile başla, sonra 3 rakam, boşluk veya tire, 3 rakam, boşluk veya tire, 2 rakam, boşluk veya tire, 2 rakam.
if (preg_match('/0[0-9]{3}[\s-][0-9]{3}[\s-][0-9]{2}[\s-][0-9]{2}/', $metin, $eslesen)) {
    echo "Bulunan ilk telefon numarası: " . $eslesen[0] . "<br>"; // Çıktı: 0555 123 45 67
} else {
    echo "Telefon numarası bulunamadı.<br>";
}

echo "<hr>";

// İfadedeki tüm uyumlu bölümleri bulur: preg_match_all()
// '/i' bayrağı: büyük/küçük harf duyarsızlığı
$kelime = "Merhaba PHP, php ve Php.";
if (preg_match_all('/php/i', $kelime, $eslesenler)) {
    echo "Bulunan tüm 'php' kelimeleri:<br>";
    foreach ($eslesenler[0] as $match) {
        echo "- " . $match . "<br>";
    }
} else {
    echo "'php' kelimesi bulunamadı.<br>";
}
/* Çıktı:
- PHP
- php
- Php
*/
?>

2. Değiştirme İşlemleri: preg_replace() ve preg_replace_callback()

Bulunan desenleri başka bir metinle değiştirmek veya eşleşen her bölüm için özel bir fonksiyon çalıştırmak için kullanılır.


<?php
$metin2 = "Kötü Kelime1, İyi Kelime, Kötü Kelime2.";

// İfadedeki uyumlu bölümleri verilenlerle değiştirir: preg_replace()
// '/i' bayrağı: büyük/küçük harf duyarsızlığı
$duzeltilmisMetin = preg_replace('/Kötü Kelime[0-9]/i', 'Değiştirildi', $metin2);
echo "preg_replace sonrası: " . $duzeltilmisMetin . "<br>"; // Çıktı: Değiştirildi, İyi Kelime, Değiştirildi.

echo "<hr>";

// İfadedeki uyumlu bölümleri değiştirmek üzere özel bir fonksiyonla işler: preg_replace_callback()
// Bu fonksiyon, PHP 5.2 versiyonunda da sorunsuz çalışır.
function kelimeyiBuyut($eslesme) {
    return strtoupper($eslesme[0]);
}

$cumle = "Bu cümlede php, javascript ve html kelimeleri var.";
// Küçük harfli kelimeyi bul ve kelimeyiBuyut fonksiyonu ile büyüt
$sonuc = preg_replace_callback('/\b(php|javascript|html)\b/i', 'kelimeyiBuyut', $cumle);
echo "preg_replace_callback sonrası: " . $sonuc . "<br>"; // Çıktı: Bu cümlede PHP, JAVASCRIPT ve HTML kelimeleri var.
?>

3. Metni Parçalama: preg_split()

Belirli bir desene göre bir metni parçalara ayırarak bir dizi oluşturmak için kullanılır.


<?php
$veriSatiri = "Elma;Armut,Çilek:Muz";

// Noktalı virgül, virgül veya iki nokta üst üste ile metni parçala
$parcalar = preg_split('/[;,:]/', $veriSatiri);
echo "preg_split sonrası parçalar:<br>";
foreach ($parcalar as $parca) {
    echo "- " . $parca . "<br>";
}
/* Çıktı:
- Elma
- Armut
- Çilek
- Muz
*/
?>

4. Dizideki Desene Uyumlu Elemanları Filtreleme: preg_grep()

Bir dizideki elemanları belirli bir düzene göre filtrelemek ve yalnızca eşleşenleri döndürmek için kullanılır.


<?php
$dosyalar = array("resim1.jpg", "belge.pdf", "rapor.doc", "foto2.png", "sunum.ppt");

// Sadece .jpg veya .png uzantılı dosyaları bul
$resimler = preg_grep('/\.(jpg|png)$/i', $dosyalar);
echo "Sadece resim dosyaları:<br>";
foreach ($resimler as $resim) {
    echo "- " . $resim . "<br>";
}
/* Çıktı:
- resim1.jpg
- foto2.png
*/
?>

5. Düzenli İfade Anahtarlarını Etkisizleştirme: preg_quote()

Eğer bir stringi düzenli ifade deseni olarak kullanmak istiyorsanız ve bu string içinde düzenli ifadelerle çakışan özel karakterler varsa (örn: '.', '*', '+', '?', '[', ']', '(', ')', '\', '/', '^', '$'), preg_quote() bu karakterlerin önüne ters eğik çizgi ekleyerek onları "sıradan" karakterler yapar ve özel anlamlarını kaybetmelerini sağlar.


<?php
$aramaDeseni = "ara.beni?*";
$temizDesen = preg_quote($aramaDeseni, '/'); // İkinci parametre deseni çevreleyen ayırıcı karakterdir.
echo "preg_quote sonrası: " . $temizDesen . "<br>"; // Çıktı: ara\.beni\?\*

$metin3 = "ara.beni?* lütfen.";
if (preg_match('/' . $temizDesen . '/', $metin3, $eslesen)) {
    echo "Temizlenmiş desenle eşleşme bulundu: " . $eslesen[0] . "<br>"; // Çıktı: ara.beni?*
}
?>

Eski Düzenli İfade Fonksiyonları (ereg_* serisi)

PHP'de bir dönem ereg_ önekiyle başlayan (POSIX Extended Regular Expression) fonksiyonlar kullanılıyordu (ereg(), eregi(), eregi_replace(), split(), spliti() gibi). Ancak bu fonksiyonlar PHP 5.3.0 sürümünden itibaren kullanımdan kaldırılmış ve PHP 7.0.0'da tamamen kaldırılmıştır. Bunun yerine, daha güçlü, daha performanslı ve daha kapsamlı olan PCRE (Perl Compatible Regular Expressions) fonksiyonları (preg_ önekli olanlar) tercih edilmektedir. Bu nedenle, projelerinizde her zaman preg_ fonksiyonlarını kullanmanızı şiddetle tavsiye ederim.

Düzenli ifadeler, metin işleme yeteneklerinizi katlayacak inanılmaz güçlü araçlardır. Başlangıçta öğrenmesi zor gibi görünse de, pratik yaparak ve farklı desenleri deneyerek kısa sürede ustalaşabilirsiniz. Veri doğrulamadan metin madenciliğine kadar birçok alanda düzenli ifadeler hayat kurtarıcı olabilir!

Webkolog'u takipte kalın!

Hepinize bol kodlu ve başarılı projeler dilerim!

0 yorum:

Yorum Gönder