在C中删除URL中的单点路径名称

时间:2015-08-30 23:12:17

标签: c string pointers url char

我在apache模块中创建一个函数,该模块应该修复抛出的URL。目前我正在尝试删除单点路径名称。

例如,如果我的网址是:

http://example.com/1/./2/./3/./4.php

然后我希望网址为:

http://example.com/1/2/3/4.php

然而,我坚持逻辑。我正在使用指针努力使这个功能尽可能快地运行。我对应该在//?添加到其末尾的行应用的逻辑感到困惑。

有人可以就如何继续提供建议吗?即使它的一些隐藏手册在线?我搜索了bing和谷歌寻找答案但没有成功。

static long fixurl(char *u){
  char u1[10000];
  char *u11=u1,*uu1=u;
  long ct=0,fx=0;
  while (*uu1){
    *u11=*uu1;
    if (*uu1=='/'){
      ct++;
      if (ct >=2){
        uu1++;
        break;
      }
    } else {
      ct=0;
    }
  }

  while (*uu1){ 
    if (*uu1!='/') { //?
      if (*uu1!='.') {
        *u11=*uu1;
         u11++;
      } //?
    } //?
    uu1++;
  }

  *u11='\0';
  strcpy(u,u1);
  return fx;
}

3 个答案:

答案 0 :(得分:4)

你忘了向前看一个角色:

if (*uu1!='/') { //?
  if (*uu1!='.') {

- 您正在检查相同的字符两次(与'不是',因此它可能有一些用处,但您的问号表明您不确定该怎么做以及继续)。

请注意,您实际上需要向前看两个字符。如果遇到斜杠,请测试. 的下一个字符和之后的另一个/字符。

我没有尝试修复你的代码(fx,返回的值应该是什么?),而是从头开始重写它,从source复制到dest并跳过违规部分。 continue确保序列/1/././2被正确清理到/1/2 - 它需要有机会再次检查第二个斜杠,所以我只是把它扔回循环。

void fixurl (char *theUrl)
{
    char *source, *dest;

    source = dest = theUrl;
    while (*source)
    {
        if (source[0] == '/' && source[1] == '.' && source[2] == '/')
        {
            source += 2;  /* effectively, 'try again on the next slash' */
        } else
        {
            *dest = *source;
            source++;
            dest++;
        }
    }
    *dest = 0;
}

(有感:)

有趣的是,为删除/../添加适当的支持是相当微不足道的。如果您测试该序列,则应向后搜索其前一个/并将dest重置为该位置。但是,您需要确保路径仍然有效。

答案 1 :(得分:1)

此代码未经测试。简而言之,它是迭代字符串(直到下一个字符是结束符号,因为如果没有下一个字符,那么你就不再有问题了)并搜索'/'。当找到一个时,分析下一个字符并处理它。

static long fixurl(char *u){
    char u1[10000];
    int currentIndex = 0;
    if (*u == '\0') {
        return 0;
    }
    for (; *(u + 1) != '\0'; u++){
        if (*u == '/') {
            if (*(u + 1) == '/') {
                continue;
            } else if ((*(u + 1) == '.') && (*(u + 2) == '.')) {
                u++;
                continue;
            }
        }
        u1[currentIndex] = *u;
    }
    strcpy(u,u1);
    return currentIndex; 
}

答案 2 :(得分:1)

这是一个有效的代码版本

注意它将删除所有'。'跟随'/'

但是,它不检查插入到输出中的无关'/'字符,因为OP发布的代码没有进行检查。

请注意I use the variable here var1 and again here var1 even a third time here var1 I use the variable here var1 and again here var1 even a third time here var1 I use the variable here var2 and again here var2 even a third time here var2 I use the variable here var2 and again here var2 even a third time here var2 语句

的正确格式

注意使用有意义的名称,删除代码杂乱, 包含一些关键评论等

请注意,文字字符位于比较的左侧,因此编写“==”时写入“=”会被编译器捕获。

for var in var1 var2;
do
  for i in `seq 2`; do
  sh (sh test2.sh $var)
  done
done