Yazılım

PHP String Fonksiyonları: Metin İşleme Sanatı

01 Mart 2026 12 dk okuma 5 görüntülenme

Ormanın Sessizliğinden Kodların Gürültüsüne: Yeniden Merhaba

Geçen hafta sonu bisikletime atlayıp ormanın derinliklerinde, telefonun çekmediği o harika sessizlikte uzun bir rota yaptım. Kamp ateşinin başında otururken aklıma hep şu gelir: Doğada her şey ne kadar yalın ve kurallıysa, yazılımda da aslında öyle olmalı. 2005 yılında o ilk "Merhaba Dünya" yazısını ekrana bastırdığım günden beri bu sadeliğin peşindeyim. Bugün Pixel Lab®'da projeler geliştirirken de temel felsefem bu: Karmaşık görüneni basitleştirmek.

İşte bu felsefeyle hazırladığım PHP serimizin 5. yazısına hoş geldiniz. Bugün konumuz: PHP String Fonksiyonları: Metin İşleme Sanatı. Yazılım dünyasında, web projelerinde karşılaştığımız verinin abartısız %80'i metinlerden oluşur. Kullanıcıdan alınan isimler, uzun blog yazıları, şifreler, e-postalar... Hepsi birer "string" (metin) katarıdır. Usta bir marangoz için alet çantasındaki zımparayı, testereyi, çekiçi bilmek ne kadar hayatiyse, bir yazılımcı için de PHP metin işleme araçlarını bilmek o kadar hayatidir.

Lafı hiç uzatmayalım, kahveniz hazırsa klavyenizin başına geçin. Çünkü bu yazıda ezber yapmayacağız; her fonksiyonun mantığını, projelerde beni nasıl kurtardığını (veya bilmediğim zamanlarda beni nasıl batırdığını) konuşacağız.

1. Temel Ölçüm ve Arama Araçları

Bir metinle çalışmaya başlamadan önce onun sınırlarını ve içinde ne barındırdığını bilmemiz gerekir. Açıkçası, yazılıma ilk başladığım yıllarda gelen verinin boyutunu kontrol etmediğim için veritabanında "Data too long" hatalarıyla az boğuşmadım.

Karakter Sayma: strlen()

Teknik olarak strlen(), bir string'in uzunluğunu (karakter sayısını) döndürür. Kulağa çok basit geliyor değil mi? Ama form doğrulamalarında en büyük yardımcınızdır.

Benim İpucum: Kullanıcıdan şifre veya kullanıcı adı alırken mutlaka strlen() ile bir alt/üst sınır belirleyin. Yoksa biri çıkar veritabanınıza 10.000 karakterlik bir isim kaydetmeye çalışır, sisteminiz şişer.

<?php
$kullanici_adi = "bugrahan";
$uzunluk = strlen($kullanici_adi);

if ($uzunluk < 5) {
    echo "Kullanıcı adı çok kısa! Ormanda tek başına kaybolmuş gibi hissettiriyor.";
} else {
    echo "Harika, {$uzunluk} karakterlik geçerli bir isim.";
}
// Çıktı: Harika, 8 karakterlik geçerli bir isim.
?>

Metin İçinde Arama: strpos()

strpos(), samanlıkta iğne aramaktır. Bir metnin içinde, aradığınız başka bir metnin kaçıncı karakterden itibaren başladığını söyler.

Gerçek Hayat Senaryosu: Bir e-posta adresinin içinde "@" işareti var mı diye hızlıca bakmak için kullanırım. Yalnız burada büyük bir tuzak vardır! Eğer aradığınız kelime metnin en başında (0. indekste) ise, PHP size 0 döndürür. Bunu `if` içinde kullanırsanız PHP `0`ı `false` sanabilir. Bu yüzden mutlaka !== false ile kesin (strict) kontrol yapmalısınız.

<?php
$email = "info@pixellab.com";
$aranan = "@";

// Yanlış kullanım: if (strpos($email, $aranan)) { ... } 
// Doğru kullanım:
if (strpos($email, $aranan) !== false) {
    echo "Evet, bu bir e-posta adresine benziyor.";
} else {
    echo "E-posta formatı hatalı!";
}
?>

2. Parçalama ve Kesme İşlemleri

Bazen elimizdeki metin çok uzundur veya sağında solunda gereksiz çöpler vardır. Bu durumlarda cerrah titizliğiyle metni kesip biçmemiz gerekir.

Fazlalıklardan Kurtulun: trim()

Ah trim()... Benim gizli kahramanım. Kullanıcılar form doldururken nedense ismin sonuna veya başına yanlışlıkla boşluk bırakmaya bayılırlar. "Buğrahan " şeklinde veritabanına kaydedilen bir isim, ileride giriş yaparken "Şifre veya kullanıcı adı hatalı" cinnetlerine sebep olur. trim() metnin sağındaki ve solundaki gereksiz boşlukları (veya belirlediğiniz karakterleri) temizler.

<?php
$gelen_veri = "   Buğrahan   ";
$temiz_veri = trim($gelen_veri);

echo "Önce: '" . $gelen_veri . "'"; // '   Buğrahan   '
echo "Sonra: '" . $temiz_veri . "'"; // 'Buğrahan'
?>

Belirli Bir Kısmı Alma: substr()

Bir blog yazısının anasayfada sadece ilk 100 karakterini göstermek istediğinizde substr() imdadınıza yetişir. Başlangıç noktasını ve kaç karakter alacağınızı söylersiniz, gerisini o halleder.

<?php
$makale = "Doğanın içinde o sadeliği ve bağımsızlığı hissetmeyi çok seviyorum. Bisikletime atlayıp...";
$ozet = substr($makale, 0, 50) . "...";

echo $ozet; 
// Çıktı: Doğanın içinde o sadeliği ve bağımsızlığı hissetme...
?>

Metni Diziye, Diziyi Metne Çevirme: explode() ve implode()

Bu ikili, yazılım dünyasının Yin ve Yang'ıdır. Geçen yazımızda dizilerden bahsederken kamp çantamı örnek vermiştim hatırlarsanız. Diyelim ki veritabanında etiketler "kamp,doğa,bisiklet,çadır" şeklinde virgülle ayrılmış tek bir metin olarak duruyor. Bunu parçalayıp bir dizi yapmak için explode(), diziyi tekrar aralarına virgül koyarak metne çevirmek için implode() kullanırız.

<?php
// Metni diziye bölme
$etiket_metni = "kamp,doğa,bisiklet,çadır";
$etiket_dizisi = explode(",", $etiket_metni);
// Artık $etiket_dizisi bir Array!

// Diziyi tekrar metne birleştirme
$yeni_metin = implode(" - ", $etiket_dizisi);
echo $yeni_metin; 
// Çıktı: kamp - doğa - bisiklet - çadır
?>

3. Dönüştürme ve Değiştirme

Kullanıcı ne girerse girsin, bizim sistemi kendi kurallarımıza göre hizaya sokmamız gerekir.

İsviçre Çakısı: str_replace()

Geldik en çok kullanacağınız fonksiyonlardan birine. PHP str_replace kullanımı öylesine yaygındır ki, onsuz bir proje düşünemiyorum. Bir metin içindeki belirli bir kelimeyi veya karakteri, başka bir şeyle değiştirmenizi sağlar.

Benim İpucum: Sansür sistemleri, telefon numarası formatlama veya şablonlardaki yer tutucuları doldurmak için birebirdir.

<?php
$yorum = "Bu ürün gerçekten çok aptalca tasarlanmış.";
$sansurlu_yorum = str_replace("aptalca", "***", $yorum);

echo $sansurlu_yorum;
// Çıktı: Bu ürün gerçekten çok *** tasarlanmış.
?>

Harf Büyütme/Küçültme: strtolower() ve strtoupper()

Metinleri tamamen küçük veya tamamen büyük harfe çevirir. Ancak burada bir Türkçe karakter yarası vardır. Standart strtolower("IŞIK") size genelde bozuk bir çıktı verir. Türkçe projelerde her zaman Multi-Byte destekli olan mb_strtolower() ve mb_strtoupper() fonksiyonlarını kullanmayı bir alışkanlık haline getirin.

4. Biçimlendirme ve Güvenlik

Metinleri işledik, peki ya onları ekrana basarken veya veritabanına gönderirken ne kadar güvendeyiz?

Temiz Kodun Sırrı: sprintf()

Değişkenlerle metinleri birleştirirken (concatenation) sürekli nokta (.) ve tırnak kullanmak kodu okunmaz hale getirir. sprintf(), bir şablon oluşturup içindeki boşluklara değişkenleri sırasıyla yerleştirmenizi sağlar. Hem çok şık görünür hem de yönetimi kolaydır.

<?php
$kullanici = "Buğrahan";
$mesaj_sayisi = 5;

// Çirkin ve yorucu yazım:
// echo "Merhaba " . $kullanici . ", bugün " . $mesaj_sayisi . " yeni mesajın var.";

// sprintf ile temiz yazım:
$sablon = "Merhaba %s, bugün %d yeni mesajın var.";
echo sprintf($sablon, $kullanici, $mesaj_sayisi);
?>

Satır Sonlarını Koruma: nl2br()

Kullanıcı bir `textarea` içinde enter tuşuna basarak paragraflar yazar. Ama siz bunu direkt HTML olarak ekrana basarsanız, HTML boşlukları ve alt satırları umursamadığı için her şey yan yana görünür. nl2br() (New Line to Break), görünmez alt satır karakterlerini (\n) HTML'in <br> etiketine çevirir.

Güvenlik Duvarı: htmlspecialchars()

Geldik dananın kuyruğunun koptuğu yere. Eğer bir mülakata girerseniz PHP htmlspecialchars nedir sorusuyla karşılaşma ihtimaliniz çok yüksektir. Daha önceki "SQL Injection'a Karşı Savunma Hattı" yazımdaki kuralları hatırlayın. Kullanıcıdan gelen veriye asla güvenmiyoruz!

Kötü niyetli biri yorum kısmına <script>alert('Hacklendin');</script> yazıp gönderirse ve siz bunu direkt ekrana basarsanız, o kod çalışır (XSS Saldırısı). htmlspecialchars(), HTML etiketlerini zararsız metin karakterlerine (entity) dönüştürür. < işareti &lt; olur ve tarayıcı bunu kod olarak değil, sadece düz metin olarak okur.

<?php
$tehlikeli_girdi = "<script>alert('Selam!');</script>";
$guvenli_cikti = htmlspecialchars($tehlikeli_girdi, ENT_QUOTES, 'UTF-8');

// Ekranda sadece kodun metin hali görünür, script çalışmaz.
echo $guvenli_cikti; 
?>

[Burada XSS saldırısının nasıl önlendiğini gösteren, öncesi/sonrası şeklinde bir infografik olsa harika olurdu, gözünüzde canlandırın.]

5. Gerçek Kullanım Senaryoları (Case Studies)

Teoriyi bırakıp pratiğe dalalım. Pixel Lab®'da çalışırken bu PHP string fonksiyonları ile her gün nasıl yüzleşiyorum? Hadi 3 farklı gerçek hayat senaryosu yazalım.

Senaryo 1: Profesyonel SEO Uyumlu Slug Oluşturucu

Müşteri blog paneline "PHP'de Metin İşleme Sanatı!" diye bir başlık girer. Bizim bunu URL'de phpde-metin-isleme-sanati haline getirmemiz gerekir. Buna PHP slug yapımı denir ve string fonksiyonlarının gövde gösterisidir.

<?php
function seoUrlOlustur($metin) {
    // 1. Türkçe karakterleri İngilizce karşılıklarıyla değiştir (str_replace)
    $turkce = ['ç','ğ','ı','i','ö','ş','ü','Ç','Ğ','İ','Ö','Ş','Ü'];
    $ingilizce = ['c','g','i','i','o','s','u','c','g','i','o','s','u'];
    $metin = str_replace($turkce, $ingilizce, $metin);
    
    // 2. Tüm harfleri küçült (mb_strtolower)
    $metin = mb_strtolower($metin, 'UTF-8');
    
    // 3. Harf ve rakam dışındaki her şeyi tireye çevir (Regex kullanıyoruz)
    $metin = preg_replace('/[^a-z0-9]/', '-', $metin);
    
    // 4. Yan yana gelmiş birden fazla tireyi tek tire yap
    $metin = preg_replace('/-+/', '-', $metin);
    
    // 5. Başta ve sonda kalan tireleri temizle (trim)
    return trim($metin, '-');
}

$baslik = "PHP'de Metin İşleme Sanatı: %100 Başarı!";
echo seoUrlOlustur($baslik); 
// Çıktı: phpde-metin-isleme-sanati-100-basari
?>

İşte bu fonksiyon, yılların tecrübesiyle şekillenmiş, her projemde çekmeceden çıkarıp kullandığım bir araçtır.

Senaryo 2: Kullanıcı Giriş Verisi Temizleme Modülü

Bir iletişim formu düşünün. Ziyaretçi adını ve mesajını gönderiyor. Bu veriyi veritabanına kaydetmeden önce bir temizlik banyosundan geçirmemiz şarttır.

<?php
function veriyiTemizle($veri) {
    // Önce sağdaki soldaki gereksiz boşlukları at
    $veri = trim($veri);
    
    // Varsa ters eğik çizgileri (escape karakterleri) temizle (eski PHP sürümleri için önlem)
    $veri = stripslashes($veri);
    
    // Son olarak HTML etiketlerini zararsız hale getir (XSS Koruması)
    $veri = htmlspecialchars($veri, ENT_QUOTES, 'UTF-8');
    
    return $veri;
}

// Formdan gelen POST verisi
$kullanici_mesaji = "   Merhaba, projem için fiyat almak istiyorum. <b>Acil!</b>   ";
$temiz_mesaj = veriyiTemizle($kullanici_mesaji);

echo $temiz_mesaj;
// Çıktı: Merhaba, projem için fiyat almak istiyorum. &lt;b&gt;Acil!&lt;/b&gt;
?>

Senaryo 3: Dinamik Şablon Sistemi Kurmak

Kullanıcılara kişiselleştirilmiş hoş geldin e-postaları göndermek istiyorsunuz. Metnin içinde {isim}, {tarih} gibi yer tutucular var. Bunu str_replace() ile çok şık bir şekilde dinamik hale getirebiliriz.

<?php
$sablon = "Merhaba {isim}, Pixel Lab® dünyasına {tarih} tarihinde katıldın. {hediye} kazandın!";

// Değişecek etiketler ve onların yerine geçecek gerçek veriler
$etiketler = ['{isim}', '{tarih}', '{hediye}'];
$veriler = ['Ahmet', date('d.m.Y'), '%20 İndirim Kuponu'];

// Array vererek tek seferde çoklu değiştirme yapıyoruz
$kisiye_ozel_mesaj = str_replace($etiketler, $veriler, $sablon);

echo $kisiye_ozel_mesaj;
// Çıktı: Merhaba Ahmet, Pixel Lab® dünyasına 24.10.2023 tarihinde katıldın. %20 İndirim Kuponu kazandın!
?>

Açıkçası en çok bu beni zamanında şaşırtmıştı; str_replace'in sadece metinleri değil, dizileri de kabul ettiğini öğrendiğimde spagetti kodlarımdan kurtulmuştum.

Klavye Başından Kalkmadan Önce

İşte böyle... Bir metni ölçtük, biçtik, içindeki zararlıları ayıkladık, formatladık ve SEO uyumlu hale getirdik. Gördüğünüz gibi kod yazmak sadece bilgisayara emir vermek değil; veriyi yoğurmak, ona şekil vermek ve güvenli bir yapı inşa etmektir. Tıpkı ormanda bir kamp alanı kurarken zemini temizlemek, ateşi güvenli bir çember içine almak ve rüzgarın yönünü hesaplamak gibi.

Bugün işlediğimiz fonksiyonlar (trim, str_replace, htmlspecialchars vb.) günlük yazılım hayatınızın demirbaşları olacak. Sizden ricam, bu sayfayı kapatmadan önce kendi yerel sunucunuzda (localhost) bu kodları bir kez olsun yazıp denemeniz. Hatalar yapın, strpos'ta false durumunu kaçırıp sistemin nasıl davrandığını kendi gözlerinizle görün. Çünkü yazılım, okuyarak değil, bozup yeniden yaparak öğrenilir.

Eğer metinleri bu kadar iyi eğitebiliyorsak, peki ya dosyalar? Bir sonraki yazımızda PHP'nin karanlık ama bir o kadar da zevkli dehlizlerine girecek ve sunucu üzerindeki dosyaları okuyup yazmayı, yani dosya sistemi yönetimini konuşacağız. O zamana kadar kodunuz temiz, kahveniz taze olsun. Görüşmek üzere!

Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yazın!

Yorum Yaz

E-posta adresiniz yayınlanmayacaktır.
0 / 2000