나는 그것에 던져지는 URL을 수정 해야하는 아파치 모듈에서 함수를 만들고 있습니다. 현재 단일 점 경로 이름을 제거하려고합니다.
예를 들어 내 URL이 다음과 같은 경우
http://example.com/1/./2/./3/./4.php
그런 다음 URL은 다음과 같습니다.
http://example.com/1/2/3/4.php
그러나 나는 논리에 집착합니다. 이 함수를 가능한 한 빨리 실행하기 위해 포인터를 사용하고 있습니다. 줄 //?
끝에 추가 해야하는 논리가 혼란 스럽 습니다.
진행 방법에 대한 조언을 줄 수 있습니까? 숨겨진 설명서가 온라인에 있더라도? 나는 bing과 google에서 성공하지 못한 답변을 검색했습니다.
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;
}
여기서 한 문자 앞을 보는 것을 잊었습니다.
if (*uu1!='/') { //?
if (*uu1!='.') {
– 동일한 문자를 두 번 확인하고 있습니다 ( 'not'에 대해 약간의 사용이있을 수 있지만 물음표는 거기에서 무엇을해야할지 확실하지 않음을 나타냄).
실제로 두 문자를 앞쪽으로 봐야 합니다. 당신이 슬래시가 발생하는 경우에 다음 문자 테스트 .
및 서로에 대한 그 후 하나 /
.
오히려 (어떤 코드를 해결하기 위해 노력보다 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
해야합니다. 그래도 경로가 여전히 유효한지 확인하고 싶을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다