v2.5.2
Giriş yap

TDK sözlük veri php ile çekme

erdal42
452 defa görüntülendi ve 1 kişi tarafından değerlendirildi
<?php
function TDKSozluk($kelime){
	$ch = curl_init("https://sozluk.gov.tr/gts?ara=elma");
	curl_setopt_array($ch, [
		CURLOPT_RETURNTRANSFER => True,
		CURLOPT_SSL_VERIFYPEER => False
	]);
	$sonuc = curl_exec($ch);
	curl_close($ch);
	$sonuc = json_decode($sonuc,True);
	return [
		"madde" => $sonuc[0]["madde"],
		"tip" => $sonuc[0]["anlamlarListe"][0]["ozelliklerListe"][0]["tam_adi"],
		"anlam" => $sonuc[0]["anlamlarListe"][0]["anlam"],
		"benzer" => $sonuc[0]["birlesikler"]
	];
}
?>

Merhabalar,
TDK'dan sözlük verisi çekmeye çalışıyordum. Ancak hata var. Nerde hata yapmış olabilirim ?

https://sozluk.gov.tr/gts?ara=elma burda tdk çalışıyor.

Cevap yaz
Cevaplar (24)
abdullahx
573 gün önce

Ben yine de opsiyonlu bir şeyler hazırladım :) Gelen kelimeye, anlama ve benzer kelimelere istediğiniz gibi limit koyabilirsiniz

<?php

/**
 * @param $kelime
 * @return string
 * - PHP de sadece baş harfini büyük yapan Türkçe uyumlu fonksiyon olmadığı için kendimiz yazdık
 */
function mb_ucfirst($kelime): string
{
    return mb_strtoupper(mb_substr($kelime,0, 1)) . mb_substr($kelime, 1);
}

/**
 * @param string $kelime - Aranacak olan kelime
 * @param string|false $kelimeLimit - Aranacak kelimenin kaç tane eş sesli anlamının döneceğini belirten parametre. false verilirse limit olmaz
 * @param int $anlamLimit - Kelimenin en fazla kaç anlamı geri dönsün
 * @param int $benzerLimit - Benzer kelimelerden en fazla kaç tane dönsün
 * @return array
 */
function TDKSozluk(string $kelime, $kelimeLimit = false, int $anlamLimit = 2, int $benzerLimit = 10): array
{
    $ch = curl_init("https://sozluk.gov.tr/gts?ara=$kelime");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false
    ]);
    $sonuc = curl_exec($ch);
    curl_close($ch);
    $sonuc = json_decode($sonuc,true);

    $return = [];
    for ($i = 0; $i <= count($sonuc); $i++) { // En fazla kaç tane kelime anlamı dönsün limiti. Yani eş anlamlı kaç kelime görünsün. Verdiğim hak örneği, hâk ve ikinci sırada bulunan hak kelimesini döndürür varsayılan 2 ile
        if ($kelimeLimit !== false) {if ($i == $kelimeLimit) break; }
        if (isset($sonuc[$i])) {
            $madde = mb_ucfirst($sonuc[$i]['madde']);
            $return[$sonuc[$i]['kac']]['kelime'] = $madde;
            for ($j = 0; $j < count($sonuc[$i]['anlamlarListe']); $j++) {
                if ($j == $anlamLimit) break;
                if (isset($sonuc[$i]['anlamlarListe'][$j])) {
                    $return[$sonuc[$i]['kac']]['anlamlar'][$j] = [
                        'anlam' => $sonuc[$i]['anlamlarListe'][$j]['anlam'],
                        'ozellik' => $sonuc[$i]['anlamlarListe'][$j]['ozelliklerListe'][0]['tam_adi'] ?? null // Sadece ilk sıradaki özelliğin değeri
                    ];
                }
            }
            $birlesikler = $sonuc[$i]['birlesikler'];
            if (strlen($birlesikler)) {
                $explode = explode(', ', $birlesikler);
                $return[$sonuc[$i]['kac']]['birlesikler'] = array_slice($explode, 0, $benzerLimit); // Birleşik kelimelerden en fazla kaç tane geri dönsün
            }
        }
    }
    return $return;
}

$h = TDKSozluk('hak', 2, 1, 5);
print_r($h);
erdal42
572 gün önce

@abdullahx hocam, acaba dediğiniz gibi sözlük skriptini paylaşabilme şansınız var mı ?

erdal42
573 gün önce

Mesela hocam if verecekken bir yerde yanlış mı yapıyorum.
echo '<div class="sozluk-kutucukg">'. $sonuc['kelime'].'</div>';

Bunları işte başlık vs yapacağım da bir yerde hata yapıyorum. İşlemiyor başlığı

abdullahx
573 gün önce

Estağfurullah sorun değil :) Kolay gelsin

erdal42
573 gün önce

Anladım hocam. Denemeye çalışacağım. Çok teşekkürler. Yeni başladık bu sebeple :) Rahatsızlık için özür dilerim.

abdullahx
573 gün önce

Hocam Array yazan yerleri kaldıramazsın ki, o php foknsiyonunun geri döndürdüğü değerin ekrana yansıtılmış hâli. Yani biz TDK dan gelen veriyi bir fonksiyon sayesinde manipüle edip kendimiz bir veri döndürdük. Bu dönen veriyi de senin yeniden işlemen lazım. Bu fonksiyondan dönen değeri döngüye sok, bir html içerisine bu kodları dök. Html içerisine php yazmayı biliyorsundur. Ekranın nasıl görüneceğine sen karar vereceksin.
Bir sonuç yoksa da fonksiyondan dönen değerin boş mu dolu olduğuna göre html i oluştur veya oluşturma

$h = TDKSozluk(htmlspecialchars($_GET['q'] ?? 'hissikablelvuku'), 2, 1, 5);

if (count($h)) {
    // Burada ekranını şekillendir
}
else {
    // Demek ki bir sonuç dönmemiş. Zaten get yöntemi ile sonuçları aldığına göre sayfanı bu şekilde oluşturabilirsin. Asıl güzel olanı aramayı ajax ile yapıp öyle sonuçları göstermen olur
}
erdal42
573 gün önce

Ha birde hocam. Sonuç yani sözlük yoksa nasıl display:none şekliden yani gözükmemesini sağlarız ? Veri çıkmayınca gözükmesin.
Birde array yazan yerler yazmıştım. Bu ikisi kaldı başka bir şey kalmadı çok teşekkür ederim :)

erdal42
573 gün önce

Benim hatam hocam :D Şimdi düzellttim.
Bu array yazan yerleri nasıl kaldırıyorduk ? Son olarak bunlar kaldı :)
https://prnt.sc/gTMo0Y08s_iv

erdal42
573 gün önce

Çok ilginç gerçekten. Ayrıca bir php dosyam var sitede gözüken. Bir çoğu php kodlar aynı yerde çalışıyor. onla alakası olabilir mi ?

abdullahx
573 gün önce

Bende çalışıyor Link

erdal42
573 gün önce

Diğer php kodlamamda
'$searchParam = htmlspecialchars($_GET['q']);'
ile çağırıyordum ve çalışıyor. Gerçekten ilginç.

abdullahx
573 gün önce

Normal koşullarda olması gerek gibi, nasıl bir şekilde çağırıyorsunuz acaba

erdal42
573 gün önce

@abdullahx Çalışmadı ne yazık ki. Hiç bir veri getirmedi hiç.

abdullahx
573 gün önce

TDKSozluk(htmlspecialchars($_GET['q']), 2, 1, 5);

böyle yapınca olmuyor mu ki?

erdal42
573 gün önce

https://prnt.sc/R7SMN2dSsaIL

Sizi de rahatsız ediyorum ama :(

erdal42
573 gün önce

$searchParam = htmlspecialchars($_GET['q']); arama metodu ile ayarlama şansımız var mı hocam?
Çok teşekkür ederim :)

erdal42
573 gün önce

Yani hocam şöyle:

Sözlük Başlığı :
Sözlük Anlamı :
Benzer sözlükler :

gibisinden. Geri bildiriminizi beklemekteyim. Yeniden teşekkürler :)

erdal42
573 gün önce

Aslında kısaca atasözü vs olmasını istemiyorum. Hatta hocam anlamın altındada birlesikler bölümü olabilir 5 10 tane :)

erdal42
573 gün önce

@abdullahx
Hocam ne alem adamsınız. Gerçekten çok teşekkür ederim :)
Şöyle ki hocam,
attığınız linki inceledim. Mesela

[anlam] => Adaletin, hukukun gerektirdiği veya birine ayırdığı şey, kazanç

Yukarıda belirtmek istediğim kısaca, başlığı olacak ve anlamı olacak aslında. Eğer sözlük çıkmadığında veya kısaca yoksa gözükmemesini sağlayacağız.

$searchParam = htmlspecialchars($_GET['q']);

arama metodu ile hak arandığında sözlük sınırı 2 tane olsun istiyorum. Yani Hak araması yapıldığında 56 tane çıkıyorsa 2 tanesi çıksın. Zaten aşağısına TDK linki atıfında bulunacağım. Daha fazlası için. Bunlar benim için yeterli hocam :)

Yeniden çok teşekkür ederim.

abdullahx
573 gün önce

Bu sözlük meselesinde zamanında çok uğraşmıştım, mesele veriyi almak değil de onu tüm ayrıntılarıyla işlemek. Biraz mükemmeliyetçi olmaya çalışınca gerçekten öyle oluyor :)
Mesela elma gibi basit kelimelerde işiniz kolay, API dan gelen veri tek bir indis içeriyor. Ama hak gibi bir kelimeden 4 farklı kelime dönüyor. Sizin kod yapınızla arayan kişi yalnızca anlamı toprak olan hâk kelimesini görecek. Maksimum 3 sözlük verisinden kastınız dönen bu değerlerin sınırı mı? Öyle bile olsa yine eksiklik oluşacak :)
Örneğin yine gelen kelimenin bir anlam sınırlaması olacak mı, örneğin çıkmak kelimesinin tam 56 farklı anlamı var. Bu kadar anlamı alt alta sıraladığınızda sözlük için sitede ayırdığınız kısım için görsel bir sorun oluşturacak mı?
Siz tam olarak hangi verileri işlemek istediğinizi biraz daha detaylı açıklayın, onları php ile işlemek işin en kolay kısmı :) Kıstas olarak hak kelimesini kullanabilirsiniz.
Link

erdal42
573 gün önce

@abdullahx
Çok teşekkür ederim yardımlarınız için.
Hatta sitemden küçük bilgi vereyim. Sitenizi inceledim. Her kelimede bazen 2 veya 3 tane çıkartabiliyor. Bu benim içinde olabilir.
Kısaca ;

$searchParam = htmlspecialchars($_GET['q']);

Bu arama ile verileri getirtiyorum. Sol tarafa kutucuk halinde div ayarladım. Örnek vereyim 'elma' aramasında sizin verdiğiniz php kod ile çıkacak. Yoksa eğer o div'in iptal olmasını yani display:none olmasını istiyorum.
Her arama da 1 den fazla sözlük var ise maksimum 3 tane sözlük verisi çekilebilir.

Baya bi uğraş verdim ama bir türlü yapamadım. Sizin verdiğiniz site baya kapmsamlı. autocomplete tarzına gerek yok. Sadece veri benim için önemli :)

Yeniden çok teşekkür ederim. Sizi bekliyor olacağım.

abdullahx
573 gün önce

Sadece bu göründüğü şekliyle var ve kendi içerisinde bir bütün,özelleştirmesi epeyi bir zaman alır. Bu durumda autocomplete için size bütün kelime listesini gönderebilirim. Sorunuza yardım için de bilgisayara geçince bakacağım.

erdal42
573 gün önce

@abdullahx
Teşekkür ederim. Bir siteme sağ tarafta eklemek istiyorum. O kodlar var ise çok teşekkür ederim. Yazı başlık olması yeterli oluyor.

abdullahx
573 gün önce

Şu an bilgisayarda olmadığım için bakamayacağım ama size şu adreste hazırlamış olduğum basit sözlük uygulamasını verebilirim. Hem veri tabanı hem de tdk api ile uyumlu çalışıyor