我在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;
}
答案 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