TDK sözlük veri php ile çekme
<?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.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (24)
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);
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
}
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
Sizi de rahatsız ediyorum ama :(
@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.
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
@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.