2010-08-27 3 views
1

Я разбираю доменное имя из строки на strchr() последним. (точка) и отсчет до точки до этого (если есть), то я знаю, что у меня есть мой домен.Разбор доменного имени

Это довольно неприятный код, и мне было интересно, есть ли у кого лучший способ.

Возможные строки я мог бы получить, являются:

  • domain.com
  • something.domain.com
  • some.some.domain.com

Вы получаете идею. Мне нужно извлечь часть «domain.com».

Перед тем, как вы скажете мне пойти искать в google, я уже это сделал. Нет ответа, поэтому я спрашиваю здесь.

Спасибо за вашу помощь

EDIT:

Строка меня содержит полное имя хоста. Обычно это в виде what.domain.com, но также может принимать другие формы, и, как кто-то упоминал, он также может иметь что угодно .domain.co.uk. В любом случае, мне нужно проанализировать доменную часть имени хоста: domain.com или domain.co.uk

+9

Как насчет ccTLD? вам нужно 'foo.co.uk' или' co.uk' достаточно? –

+0

Хорошая точка! спасибо за указание, что один из – Jessica

+2

@ Justin Ethier. Хотя я действительно ценю исправление опечаток и способ сделать мой вопрос более читабельным, редактируя вопрос без каких-либо значимых целей, это довольно раздражает. – Jessica

ответ

2

Возможно, вы имели в виду strrchr()?

я бы, наверное, подходить к этому, выполнив:

  1. strrchr, чтобы получить последнюю точку в строке, сохранить указатель здесь, заменить точку с NUL ('\0').
  2. strrchr еще раз, чтобы получить следующий для последней точки в строке. Персонаж после это начало названия, которое вы ищете (domain.com).
  3. Используя указатель, сохраненный в # 1, положите точку туда, где вы установили ее NUL.

Опасайтесь, что имена иногда могут заканчиваться точкой, если это действительная часть вашего набора входных данных, вам нужно будет ее учесть.

Редактировать: Чтобы справиться с гибкостью, необходимой вам в примерах example.co.uk и других, функция, описанная выше, примет дополнительный параметр, рассказывающий о том, сколько компонентов нужно извлечь из конца имени.

Вы сами понимаете, как решить, сколько компонентов извлечь - как упоминает Филипп Поттер в комментарии ниже, это трудная проблема.

+0

позвольте мне попробовать, однако, как упомянул Филипп Поттер, как я могу обращаться с domain.co.uk? – Jessica

+0

@Jessica: вам нужно более четко определить, что вы хотите. Например, .jp, .uk и .au имеют общие области второго уровня: co.uk, co.jp, com.au. Но другие, такие как .de, .es, .be, .tk, не делают: amazon.de и т. Д. Что именно вы хотите? Если вы хотите извлечь последнюю «значимую» часть домена, это трудная проблема. –

+0

См. Отредактированный вопрос – Jessica

0

Не знаете, какой вкус C, но вы, вероятно, захотите подделать домен, используя «.». как разделитель.

Попробуйте это: http://www.metalshell.com/source_code/31/String_Tokenizer.html

Как для доменного имени, не уверен, что ваша конечная цель, но домены могут иметь много и много узлов, вы могли бы иметь доменное имя foo.baz.biz.boz. bar.co.uk.

Если вы просто хотите использовать последние 2 узла, используйте выше и получите последние два токена.

+0

Доменное имя может содержать только 255 октетов, а не совсем «бесконечно» ... – bstpierre

+0

просто имя.something, где .something может быть .com, .net. и т. д. или в форме .co.uk и т. д. – Jessica

+0

Я пробовал раньше с помощью strtok, но мне нужно продолжать чтение сохраненных строк ... если вы не знаете, как это сделать, – Jessica

2

Это не ответ на сам вопрос, но идея альтернативного подхода:

В контексте уже очень неприятный код, я бы утверждать, что это хороший способ, чтобы сделать его менее противным, и обеспечить хороший способ разбора доменных имен и подобных - использовать PCRE или аналогичную библиотеку для регулярных выражений. Это определенно поможет вам, если вы также хотите подтвердить, что tld существует, например.

Это может потребоваться некоторое время для изучения, но если вам нужно внести изменения в существующий код соответствия/синтаксического анализа или создать больше кода для сопоставления строк, я бы утвердил, что regex-lib может упростить это в в долгосрочной перспективе. Специально для более продвинутого соответствия.

Другая библиотека, которую я помню, которая поддерживает регулярное выражение, является glib.

+0

спасибо. Я бы определенно попробовал регулярные выражения, однако я не могу использовать внешний. – Jessica

+0

С чем связан данный проект? Только Libc? – Kvisle

+0

есть. только стандартный C и все. – Jessica

Смежные вопросы