步步遞近網路蜘蛛(一)v1.0

來源:互聯網
上載者:User

/*
 * 名稱:步步遞近網路蜘蛛(一)
 *
 * 版本:v1.0
 *
 * 作者:張雙喜
 *
 * 日期:2010.10.17
 *
 * 功能:從一段字串中,找出合法的網址(在html中文法表達中正確的網址)
 *
 * 過程設計:
 *     根據html文法規則進行篩選出網址
 *     1、函數:my_strncmp(char *p, char *q, int n)
 *        功能:自己類比實現庫函數strncmp
 *     
 *     2、函數:judge_mark(char **p)
 *        功能:判斷是不是"<a "或"  <a ",如果是,則進行下一步操作;
 *        如果不是,返回NULL;
 *
 *     3、函數:judge_href(char **p)
 *        功能:判斷是不是"  href",如果是,則進行下一步操作;
 *            如果不是,返回NULL;
 *
 *     4、函數:judge_equal_mark(char **p)
 *        功能:判斷是不是"  =",如果是,則進行下一步操作;
 *            如果不是,返回NULL;
 *
 *     5、函數:judge_http(char **p)
 *        功能:判斷是不是"  http",如果是,則進行下一步操作;
 *            如果不是,返回NULL;
 *
 *     6、函數:link(char **p)
 *        功能:調用2、3、4、5函數,找到正確的網址
 *
 *    7、函數:pritnf_link(char *p)
 *       功能:列印網址
 *       備忘:到網址結尾時,要對結尾進行處理,否則會一塊把後面的a>等其他資訊也列印出來
 *
 * */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//自己實現的strncmp函數
int my_strncmp(char *p, char *q, int n)
{
    int i = 0;
    int count = 0;

    for( i = 0; i < n; i++)
    {
        if(*(p+i) == *(q+i))
        {
            count++;
        }
    }

    if(count == n)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

//判斷是否滿足"<a "
char * judge_mark(char **p)
{
    while(' ' == **p)
    {
        (*p)++;
    }
    
    if(0 == my_strncmp(*p, "<a ", 3))
    {
        *p = *p + 3;

        return *p;
    }
    else
    {
        return NULL;
    }

}

//判斷是否滿足****  href
char * judge_href(char **p)
{
    while(' ' == **p)
    {
        (*p)++;
    }
    if(0 == my_strncmp(*p, "href", 4))
    {
        *p = *p + 4;
        return *p;
    }
    else
    {
        return NULL;
    }
}

//判斷是否滿足***  =
char * judge_equal_mark(char **p)
{
    while(' ' == **p)
    {
        (*p)++;
    }
    if('=' == **p)
    {
        return (*p) + 1;
    }
    else
    {
        return NULL;
    }

}

//判斷是否滿足**  ["]  ['] http
char * judge_http(char **p)
{
    while((' ' == **p) || ('/"' == **p) || ('/'' == **p))
    {
        (*p)++;
    }

    if(('/"' == **p) || ('h' == **p) || ('/'' == **p))
    {
        return (*p);
    }
    else
    {
        return NULL;
    }
}

//功能:產生要網址
char * link (char **p)
{
    char *ret;

    ret = judge_mark(p);
    if(NULL != ret)
    {
        ret = judge_href(&ret);
    }
    if(NULL != ret)
    {
        ret = judge_equal_mark(&ret);
    }
    if(NULL != ret)
    {
        ret = judge_http(&ret);
    }

    return ret;
}

//列印網址
void printf_link(char *p)
{
    int i = 0;

    if(NULL != p)
    {
  
     while(((*(p+i) != '/"') && (*(p+i) != '/'') &&
(*(p+i) != '>') && (*(p+i) != '/0') && (*(p+i) != '
')))
        {
            printf("%c", *(p+i));
            i++;
        }
        printf("/n");
    }

    return;
}

int main(int argc, char* argv[])
{
    char *ret;

    char *s1 = "      <a     href   =  /"http://www.akaedu.org/"> ok </a>";
    char *s2 = "  <a  href =    http://www.akaedu.org  ";
    char *s3 = "< a  href =    http://www.akaedu.org";
    char *s4 = "<a      href         =      /"        http://www.akaedu./"org";

    ret = link(&s1);
    printf_link(ret);

    ret = link(&s2);
    printf_link(ret);

    ret = link(&s3);
    printf_link(ret);

    ret = link(&s4);
    printf_link(ret);

    return 0;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.