2012-07-08 5 views
1

웹 응용 프로그램을 사용하면 상대 경로를 포함 할 수있는 "슬러그"를 지정할 수 있습니다. /somedir/some-file.htm.상대 경로 정규식

라우팅 구성에서 유효한 슬러그 (세그먼트 포함) 만 지원되는지 확인해야합니다.

내가 사용 정규식은 다음과 같습니다

(^[a-z0-9])([a-z0-9-/]+)([a-z0-9])$ 

이 의미

  • 유효한 슬러그는 예를 들어 일치합니다 some-file.htm
  • 세그먼트가있는 유효한 슬러그 (상대 경로)는 예 : somedir/subdir/some-file.htm
  • 절대 URL은 예를 들어. /somedir/some-file.htm
  • 예 :/또는 -와 일치하지 않습니다. -slug-

불행하게도 이중 슬래시는 예를 들어. somedir // subdir // some-file.htm 내 표현식이 하나 이상의 슬래시를 허용하기 때문에.

세그먼트 사이에 0 개 이상의 슬래시를 허용하려면 어떻게 변경해야합니까?

(^[a-z0-9])(/?[a-z0-9-]+/?)([a-z0-9])$ 

가 작동 것이지만, 그렇지 않습니다 :

나는 생각했다.

+0

이를 따라 주목해야한다 파일 시스템에서'/'와'\ 0 '을 제외한 모든 문자는 파일 이름에서 유효한 문자로 간주 될 수 있습니다. 여기에는 UTF 특정 문자 및 ASCII 제어 코드까지 포함됩니다. – OmnipotentEntity

답변

3

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$

편집 : 그것은 지저분하고 복잡한 보이는

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*$

,하지만 당신의 사양에 따라 올바른 것 같다 : 첫 번째 정규 표현식을 좋아하는 경우에이 하나를 사용하십시오.

[a-z0-9]([a-z0-9-]*[a-z0-9])?

은 하나의 이름과 일치합니다. 잠시 동안 /을 무시합니다.

그런 다음 나머지는 동일한 슬래시 다음에 다시 동일한 것입니다.

Karoly의 대답에서 언급했듯이, 예를 들어 "some-file.htm"은 내가 쓴 정규 표현식과 일치하지 않는 문자 그대로의 마침표를 포함하지 않습니다.이 다음 동작을 원하는 경우

당신은 실제로 원하는 것 : 허용 할 경우

^[a-z0-9]([a-z0-9-\.]*[a-z0-9])?(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)*$

마지막으로, 마지막 섹션의 문자 기간은 다음 원하는 것 :

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

EDIT :

생각은 lookahe이 사용 다소 단순화 될 수있다 발생 광고 및 배후.

^[a-z0-9]([a-z0-9-]*[a-z0-9])?(/[a-z0-9]([a-z0-9-]*[a-z0-9])?)*(/[a-z0-9]([a-z0-9-\.]*[a-z0-9])?)?$

가된다 : 올바른 경로

^(?!-)[a-z0-9-]+(?<!-)(/(?!-)[a-z0-9-]+(?<!-))*(/(?!-\.)[a-z0-9-\.]+(?<!-\.))?$

+0

첫 정규식은 내 모든 요구 사항을 충족합니다. 감사. –

+1

당신은 아마도 선견자와 배후의 버전을 가져 가야합니다. 나는 그것을 처음 편집 할 것이다. 꽤 정비가 잘됩니다. – OmnipotentEntity

+0

더 정비 가능하지만 더 복잡합니다. 당신도 정규식으로 이것을 할 수 있다는 것을 알지 못했습니다 :) –

1
(^[a-z0-9]+)(/[a-z0-9-]+)*([a-z0-9])$ 

참고 : 정규식에 .이 표시되지 않습니다.

개인적으로 나는 첫 번째 문자와 마지막 문자를 개별적으로 테스트 할 것이기 때문에 정규 표현식을 훨씬 간단하고 유용하게 만들 수 있습니다.

+0

이중 슬래시 요구 사항에 적합하지만 표준 슬러그와 일치하지 않습니다. 예 : "이것은 시험이다." 우리는 ""을 허용하지 않습니다. 우리 민달팽이에서. –

+0

아마도'(^ [a-z0-9]) (/? [a-z0-9 -] +) * ([a-z0-9]) $' –

+0

@Ben Foster : 왜 더 좋을까요? –

0

체크 (상대 또는 절대 도트 숨겨져 폴더이다.)
^([a-z]:)*(\/*(\.*[a-z0-9]+\/)*(\.*[a-z0-9]+))