PHP String Fonksiyonları: Arama, Değiştirme ve Biçimlendirme

PHP String Fonksiyonları: Arama, Değiştirme ve Biçimlendirme

4 dakika okuma

Metin işleme, web uygulamalarında en çok tekrarlanan işlerden biri. PHP bu iş için geniş bir fonksiyon kümesi sunar, ancak fonksiyonların büyük bölümü baytlar üzerinde çalışır. Türkçe metinlerde doğru sonuç almak için hangi fonksiyonun ne üzerinde işlem yaptığını bilmek gerekir.

Uzunluk ve UTF-8 tuzağı

UTF-8 kodlamasında Türkçe karakterler iki bayt kaplar. Bayt sayan fonksiyonlar bu yüzden beklenenden büyük sonuç verir. Karakter sayısı gerekiyorsa mb_ ile başlayan çok baytlı sürüm kullanılmalıdır:

PHP4 satır
$metin = 'Çağrı';

echo strlen($metin);      // 7  (bayt sayısı)
echo mb_strlen($metin);   // 5  (karakter sayısı)

Aynı ayrım kesme işleminde de geçerlidir. substr bir karakteri ortasından böldüğünde çıktıda bozuk karakter oluşur; mb_substr bu sorunu yaşatmaz. Kısaltma yapan her yerde çok baytlı sürüm tercih edilmelidir.

Arama işlemleri

PHP 8 ile gelen üç fonksiyon, eskiden strpos ile yazılan kontrolleri okunur hale getirdi. strpos sıfır döndürebildiği için katı karşılaştırma gerektiriyor ve bu detay sık atlanan bir hata kaynağıydı:

PHP7 satır
if (str_contains($baslik, 'php')) { /* ... */ }
if (str_starts_with($yol, '/admin')) { /* ... */ }
if (str_ends_with($dosya, '.jpg')) { /* ... */ }

// konum gerekiyorsa
$konum = strpos($metin, 'anahtar');
if ($konum !== false) { /* ... */ }

Büyük küçük harf duyarsız arama için stripos kullanılır. Türkçe karakter içeren aramalarda ise mb_stripos daha güvenilir sonuç verir.

Değiştirme

Sabit metin değişimi için str_replace yeterlidir ve dizi kabul ettiği için birden fazla değişimi tek çağrıda yapabilir. Kalıp gerekiyorsa düzenli ifade kullanılır, ancak düzenli ifade her zaman daha yavaştır:

PHP4 satır
$temiz = str_replace(['\r\n', '\r'], '\n', $girdi);

$slug = preg_replace('/[^a-z0-9]+/', '-', mb_strtolower($baslik, 'UTF-8'));
$slug = trim($slug, '-');

Basit bir işi düzenli ifadeyle yapmak, hem okunurluğu düşürür hem gereksiz maliyet ekler. Sabit metin aranıyorsa str_replace tercih edilmelidir.

Bölme ve birleştirme

PHP8 satır
$parcalar = explode(',', 'ayse,mert,zehra');
$birlesik = implode(' | ', $parcalar);

// sınırlı bölme: en fazla iki parça
[$kullanici, $alan] = explode('@', $eposta, 2);

// satırlara ayırma
$satirlar = preg_split('/\R/', $metin, -1, PREG_SPLIT_NO_EMPTY);

explode ikinci parametreyle sınırlandırıldığında, ayırıcının metnin devamında tekrar geçmesi sorun çıkarmaz. Eposta adresi ayrıştırma gibi işlerde bu sınır hatalı sonuçları önler.

Biçimlendirme

Sayı ve metni bir arada üretirken birleştirme operatörü yerine biçimlendirme fonksiyonları kullanmak, çıktının tutarlı kalmasını sağlar:

PHP5 satır
printf('%s: %.2f TL', $urun, $fiyat);

echo number_format(1234567.891, 2, ',', '.');  // 1.234.567,89

echo str_pad('7', 3, '0', STR_PAD_LEFT);        // 007

Türkçe biçimde ondalık ayırıcı virgül, binlik ayırıcı noktadır. number_format bu iki karakteri parametre olarak aldığı için yerelleştirme ayarına bağlı kalmadan doğru çıktı üretir.

Kırpma ve temizleme

Kullanıcıdan gelen metinde baştaki ve sondaki boşluklar neredeyse her zaman istenmez. trim varsayılan olarak boşluk, sekme ve satır sonlarını temizler; ikinci parametreyle hangi karakterlerin kırpılacağı belirlenebilir:

PHP6 satır
$ad = trim($_POST['ad'] ?? '');
$yol = rtrim($dizin, '/') . '/dosya.txt';

// uzun metni kelime bölmeden kısalt
$ozet = mb_substr($icerik, 0, 160);
$ozet = mb_substr($ozet, 0, mb_strrpos($ozet, ' ')) . '...';

Türkçe karakterler ve harf dönüşümü

Büyük küçük harf dönüşümü Türkçede özel bir sorun barındırır. Noktasız ı harfinin büyüğü I, noktalı i harfinin büyüğü İ olmalıdır. Standart fonksiyonlar bu ayrımı yapmaz ve i harfini I'ya çevirir:

PHP2 satır
echo strtoupper('istanbul');            // ISTANBUL (yanlış)
echo mb_strtoupper('istanbul', 'UTF-8'); // İSTANBUL

Karşılaştırma yapılacaksa iki tarafı da aynı fonksiyonla dönüştürmek gerekir. Kullanıcı adı ve eposta gibi alanlarda küçük harfe çevirip saklamak, sonraki karşılaştırmaları tutarlı hale getirir.

Karşılaştırma ve sıralama

İki metnin eşitliği karşılaştırılırken tip dönüşümüne izin verilmemelidir. Katı karşılaştırma hem daha hızlıdır hem de sayıya benzeyen metinlerde beklenmeyen eşleşmeleri önler. Sıralamada ise alfabetik sıra ile doğal sıra arasındaki fark önem kazanır: standart sıralama dosya2 ile dosya10 karşılaştırıldığında dosya10 değerini önce koyar.

PHP9 satır
// katı karşılaştırma
if ($girilen === $beklenen) { /* ... */ }

// doğal sıralama: dosya2, dosya10 doğru sırada gelir
natsort($dosyalar);

// Türkçe alfabetik sıralama
$c = new Collator('tr_TR');
$c->sort($isimler);

Türkçe karakterlerin doğru sıralanması için Collator sınıfı kullanılır. Standart sıralama karakterleri kod değerine göre dizdiği için ç, ğ, ı gibi harfler listenin sonuna atılır.

Kontrol listesi

  • Karakter sayısı gereken her yerde mb_ ile başlayan sürüm kullanılır.
  • strpos sonucu katı karşılaştırmayla kontrol edilir.
  • Sabit metin değişiminde düzenli ifade yerine str_replace tercih edilir.
  • Kullanıcı girdisi trim edilerek alınır.
  • Ekrana basılan her metin htmlspecialchars ile kaçırılır.

PHP eğitim serisi

Bu yazı, temel sözdiziminden üretim ortamına kadar ilerleyen 25 bölümlük serinin bir parçası. Bölümler sırayla okunacak biçimde hazırlandı, ancak her biri tek başına da kullanılabilir.

Temeller

  1. Kurulum ve temel sözdizimi
  2. Döngüler ve akış kontrolü
  3. Diziler
  4. Fonksiyonlar
  5. String fonksiyonları (bu yazı)
  6. Süper globaller
  7. Form işleme
  8. Dosya işlemleri

Dilin ayrıntıları

  1. Tip sistemi ve strict_types
  2. Hata ve istisna yönetimi
  3. Düzenli ifadeler
  4. Tarih ve saat işlemleri

Nesne yönelimli PHP

  1. Sınıf ve nesne
  2. Kalıtım, arayüz ve trait
  3. Statik üyeler, sabitler ve enum
  4. Namespace, Composer ve autoload

Veri ve güvenlik

  1. PDO ile veritabanı işlemleri
  2. Oturum yönetimi ve kimlik doğrulama
  3. Güvenli çıktı ve XSS
  4. JSON ile veri değişimi

Dış dünya ve üretim

  1. cURL ile dış API çağırma
  2. Kendi REST API'ni yazmak
  3. PHPUnit ile birim test
  4. Hata ayıklama ve performans ölçümü
  5. Üretime alma ve güvenlik

Yorumlar

Bu form reCAPTCHA ile korunur; Google Gizlilik Politikası ve Hizmet Şartları geçerlidir.

İlk yorumu sen yap.

İlgili Yazılar