• 21-05-2020, 12:55:36
    #1
    Merhaba arkadaşlar;

    preg_replace fonksiyonun da işin içinden çıkamadığım bir türkçe karakter sorunuyla başbaşayım.

    preg_replace('/\binç\b/i', 'inc);
    Yukarıda ki kodumda büyük küçük haf duyarlılığına bakılmaksınız sadece "inç" kelimesini inc'ye çevirmem gerekiyor.

    Not: Amaç burada seo tarzı bir işlem yapmak değil. Burada bir sürü döngü bulunmakta. Döngü de değiştirmek istediğim değerler ve fonksiyonlar bulunmaktadır.

    İlginç olan, Türkçe karakter kodları kelimenin içinde herhangi bir yerde ise ("eçi" gibi) bulmakta sorun yaşamıyor. Ama bu türkçe karakterler kelimenin başında veya sonunda olduğu zaman bir türlü bulmuyor.

    Bu konu hakkında yardımlarınızı rica ediyorum.
  • 21-05-2020, 12:57:20
    #2
    batuhan_polat adlı üyeden alıntı: mesajı görüntüle
    Merhaba arkadaşlar;

    preg_replace fonksiyonun da işin içinden çıkamadığım bir türkçe karakter sorunuyla başbaşayım.

    preg_replace('/\binç\b/i', 'inc);
    Yukarıda ki kodumda büyük küçük haf duyarlılığına bakılmaksınız sadece "inç" kelimesini inc'ye çevirmem gerekiyor.

    Not: Amaç burada seo tarzı bir işlem yapmak değil. Burada bir sürü döngü bulunmakta. Döngü de değiştirmek istediğim değerler ve fonksiyonlar bulunmaktadır.

    İlginç olan, Türkçe karakter kodları kelimenin içinde herhangi bir yerde ise ("eçi" gibi) bulmakta sorun yaşamıyor. Ama bu türkçe karakterler kelimenin başında veya sonunda olduğu zaman bir türlü bulmuyor.

    Bu konu hakkında yardımlarınızı rica ediyorum.
    o zaman n++'dan replace all inç>cinç yapın mesela sonra da o halini preg_replace edin
  • 21-05-2020, 13:03:26
    #3
    Hocam tam anlamadım dediğini ama türkçe karakterler kelimenin başında veya sonunda olduğu zaman hiçbir şekilde algılamıyor.
  • 21-05-2020, 13:06:34
    #4
    u flagını ekleyin regex'e. word boundary, w sadece a-zA-Z0-9 ASCII karakterleri destekliyor. Birden fazla catch lazımsa g flagını da unutmayın.

    https://regex101.com/r/OdYvef/1
  • 21-05-2020, 13:09:18
    #5
    Bu şekil olmuyor mu?
    https://regex101.com/r/BbAiek/1
  • 21-05-2020, 13:12:00
    #6
    Abdullahx adlı üyeden alıntı: mesajı görüntüle
    Bu şekil olmuyor mu?
    https://regex101.com/r/BbAiek/1
    Tam kelimeleri almak istiyor arkadaş. O yüzden başa ve sona word boundary koymuş.
  • 21-05-2020, 13:14:57
    #7
    berkantipek adlı üyeden alıntı: mesajı görüntüle
    u flagını ekleyin regex'e. word boundary, w sadece a-zA-Z0-9 ASCII karakterleri destekliyor.
    https://regex101.com/r/OdYvef/1
    Dostum bende https://regexr.com/552n6 buradan deniyordum. Burada aynısını defalarca yapmama rağmen geçmedi. Zaten aynısını kodumda da denedim. Gene bir değişiklik olmadı. En son çare hex kodunu denedim. ("u00e7"). Gene cümle içinde algılıyor fakat başlarda ve sonlarda algılamıyor.


    Abdullahx adlı üyeden alıntı: mesajı görüntüle
    Bu şekil olmuyor mu?
    https://regex101.com/r/BbAiek/1
    Berkant arkadaşımın dediği gibi tam kelimeleri almak istiyorum dostum. Bu şekilde sorun olmuyor
  • 21-05-2020, 13:24:03
    #8
    batuhan_polat adlı üyeden alıntı: mesajı görüntüle
    Dostum bende https://regexr.com/552n6 buradan deniyordum. Burada aynısını defalarca yapmama rağmen geçmedi. Zaten aynısını kodumda da denedim. Gene bir değişiklik olmadı. En son çare hex kodunu denedim. ("u00e7"). Gene cümle içinde algılıyor fakat başlarda ve sonlarda algılamıyor.
    Başlarda ve sonlarda derken ne demek istiyorsunuz onu anlamadım. Örnek bir subject atar mısınız?

    Ben şöyle bir şey yaptım: https://repl.it/repls/ViciousVapidCleaninstall
  • 21-05-2020, 13:58:14
    #9
    berkantipek adlı üyeden alıntı: mesajı görüntüle
    Başlarda ve sonlarda derken ne demek istiyorsunuz onu anlamadım. Örnek bir subject atar mısınız?

    Ben şöyle bir şey yaptım: https://repl.it/repls/ViciousVapidCleaninstall
    Hocam mesela türkçe karakterlerden herhangi biri cümle başında olduğu zaman:
    Örneğin: çin , niç veya İnç gibi.
    Döngüden gelen örnek:
    $result = preg_replace('/\bçin\b/ui', 'chaina', $array);
    veya
    $result = preg_replace('/\bniç\b/ui', 'herhangi_bir_şey', $array);
    veya
    $result = preg_replace('/\binç\b/ui', 'inc', $array);
    gibi türkçe karakterler kontrol edilmek istendiğinde $array içinde bulunan aynı kelimeleri bulmuyor. regexr[.]com sitesinde de denediğimde aynı sonuçla karşılaşıyorum.

    Fakat türkçe karakter kelimenin ortasında herhangi bir yerde olduğu zaman herhangi bir sorun olmuyor.
    Mesela Örneğin: içine, şına
    Döngüden gelen örnek:
    $result = preg_replace('/\biçin\b/ui', 'herhangi_bir_şey', $array);
    Array içinde eşleşmesi gerekenleri bulup değiştiriyor. Sorun olmuyor. Aynısını regexr[.]com sitesinde de denediğimde burada da başarılı sonuç döndürüyor.

    Belirttiğiniz kodu da denedim. Fakat gene bulamadı.

    Edit:

    Ben bu yolu kısa yoldan çözemedim.
    Her zaman kendi yöntemlerimi en son çare olarak kullanırım.Burada da son çare kullanmak zorunda kaldım.

    Benim gibi sorun yaşayanlar olursa aşağıda ki yöntem ile sorununa çözüm bulabilir. Ben hayat kurtarmak için bu çözümü ürettim kendi kendime. İlerleyen dönemlerde sorunun daha basit yöntemini bulursam paylaşıyor olacağım.

    Önce bir fonksiyon oluşturdum.

    Aşağıda ki fonksiyon ile türkçe karakter kodlarını kendi yöntemimle ürettiğim benzersiz bir değere dönüştürdüm. Bunun için önce türkçe karakterin hex karşılığını aldım, çakışmama olasılığını arttırmak için bu hex kodların başına ve sonuna ikişer tane x karakteri ekledim.

    function tr_to_hex($str, string $q=NULL){
    $q = $q && ($q == 'encode' || $q == 'decode') ? $q : 'encode';
    $tr_chars = array('ı','İ','ç','Ç','ş','Ş','ö','Ö','ü','Ü','ğ','Ğ');
    $hex_chars = array('xx0131xx','xx0130xx','xx00e7xx','xx00c7xx','xx015fxx','xx015exx','xx00f6xx','xx00d6xx','xx00fcxx','xx00dcxx','xx011fxx','xx011exx');
    if($q == 'decode'){
    $results = str_replace($hex_chars, $tr_chars, $str);
    }else{
    $results = str_replace($tr_chars, $hex_chars, $str);
    }
    return $results;
    }
    Örnek:
    echo tr_to_hex('Çiçek', 'encode')
    Sonuç: xx00e7xxixx00e7xxek
    echo tr_to_hex('xx00e7xxixx00e7xxek', 'decode')
    Sonuç: Çiçek

    Bu şekilde türkçe karakter kodlarından kaçınmış oluyorum ve türkçe karakter cümlenin neresinde olursa olsun sorunsuz değişim yapabiliyorum.

    En basit yoldan:
    $result = tr_to_hex(preg_replace(tr_to_hex('Çiçek', 'encode'), 'değiştirilecek_değer', tr_to_hex($array, 'encode')), 'decode');
    Preg'de bulunması gereken değerler ile bulunacak değerleri fonksiyonum ile encode yaparak türkçe karakterleri değiştirdim.
    En sonda ise çıkan sonucu decode ile orjinal haline getirdim.

    Bu şekilde çözüm yolu ürettim. Olur da benim gibi sorun yaşayanlar olursa bu şekilde ihtiyacını giderebilirler.
    ,
    Saygılarımla...



    Edit 2:

    Bunun yanında bir çözüm yöntemi daha keşfettim. Fonksiyonsuz ve en sade biçimde. Çok zamanımı harcadı fakat preg_replace olayını daha iyi kavramış oluyorum

    $resutl = preg_replace('/\b(i|İ)n(ç|Ç)\b/iu', 'inc', $array);
    Türkçe karakterleri parantez içine alarak büyük ve küçük harfi olacak şekilde iki koşul belirterek te bu işin içinden çıkabilirsiniz.

    (i|İ)n(ç|Ç) gibi..

    Tekrar saygılarımla