Как разобрать вывод dict удобным для пользователя способом в PHP? - PullRequest
1 голос
/ 20 августа 2009

Я пытаюсь реализовать службу словарного типа. Я отправляю запрос с php с помощью cURL на dict.org с протоколом dict. Это мой код (который сам по себе работает и может быть полезен для будущих читателей):

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "dict://dict.org/define:(hello):english:exact");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$definition = curl_exec($ch);
curl_close($ch);

echo $definition;

Сервер возвращает определение, как и ожидалось, вместе с несколькими заголовками (которые мне не нужны). Ответ выглядит примерно так:

220 miranda.org dictd 1.9.15/rf on Linux 2.6.26-2-686 <auth.mime> <29631663.31530.1250750274@miranda.org>
250 ok
150 3 definitions retrieved
151 "Hello" gcide "The Collaborative International Dictionary of English v.0.48"
Hello \Hel*lo"\, interj. & n.
   An exclamation used as a greeting, to call attention, as an
   exclamation of surprise, or to encourage one. This variant of
   {Halloo} and {Holloo} has become the dominant form. In the
   United States, it is the most common greeting used in
   answering a telephone.
   [1913 Webster +PJC]
(... some content removed)

.
250 ok [d/m/c = 3/0/162; 0.000r 0.000u 0.000s]
221 bye [d/m/c = 0/0/0; 0.000r 0.000u 0.000s]

Мне было интересно, если:

a) Есть ли способ указать curl (или параметр в протоколе dict), чтобы не возвращать всю эту дополнительную информацию (т.е. 250 ok [d/m/c = 3/0/162; 0.000r...])

б) Вы, вероятно, заметили, что в ответ на диктовку возвращается информация, которая отображается не самым удобным для пользователя способом. Мне было интересно, если бы кто-нибудь знал о какой-либо существующей библиотеке php, которая позволила бы мне отобразить это более хорошим способом. В противном случае я должен был бы написать свой собственный код.

в) Если это не так, как большинство веб-сайтов словарей получают свои определения, как они это делают? В моем понимании самая полная словарная база данных - это база данных dict.org (которая поддерживает dict protocol и именно туда я отправляю свой запрос cURL).

Спасибо!

1 Ответ

1 голос
/ 20 августа 2009

Прежде чем я начну, позвольте мне заявить, что я не знаю специфику протокола dict.

Я сомневаюсь, что вы сможете создать запрос, который только доставляет текст. Информация, которую вы хотите удалить, выглядит как информация о статусе и поэтому полезна.

Я бы справился с этим следующим образом:

  1. Считать данные ответа скручивания в массив, чтобы каждая строка была отдельной записью в массиве. Для этого вы можете использовать explode() и разделить символ новой строки (\ n).
  2. Перебор массива, EG for ($response as $responseLine) {}
  3. выполнить регулярное выражение (или другую форму сопоставления с образцом) в $ responseLine, чтобы найти определение. Похоже, что реальный текст - это единственный $ responseLine, который не начинается с цифры.

Возможно, вы захотите проверить, какой набор символов использует протокол dict. Я не упомянул какую-либо обработку ошибок, но это должно быть прямо вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...