2009-09-08 2 views
0

하자 내가이이 말 URL의문제가 다시

site.com/hello-world/test.html 
site.com/hello-world/test/test.html 

내가 처음 URL로 이동하면 나는이 정규식에게 정규식

^.*/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 

하지만 URL을 2도 유 효 URL이 ? 첫 번째 url은 두 번째가 아닌 vaild되어야하는 URL이라는 것을 정규 표현식에 어떻게 알릴 수 있습니까?

+1

답변을 받으려면 왜 첫 번째 URL이 유효하고 두 번째 URL이 유효하지 않은지를 말해야합니다. –

+2

무한한 해결책이 있습니다. 빌드하고자하는 정규식 논리는 무엇입니까? –

+0

예 - 사소한 해결책은 정규식'^ site \ .com/hello-world/test \ .html $'입니다. 두 번째 URL이 아닌 첫 번째 URL과 일치합니다. – MSalters

답변

3

두 번째 문자열은 또한 정규식에 대한 유효한 : 더 나은

 
sub-expression  result 
----------------------------------------------------------------------- 
^.*     matches: "site.com/hello-world/test/test.html" 
/     backtrack: "site.com/hello-world/test/" 
([a-z0-9,-]+)   matches: "site.com/hello-world/test/test" 
/     backtrack: "site.com/hello-world/test/" 
([a-z0-9,-]+).html$ matches: "site.com/hello-world/test/test.html" 

는 :

 
sub-expression  result 
----------------------------------------------------------------------- 
^[^/]+    matches: "site.com" 
/     matches: "site.com/" 
([a-z0-9,-]+)   matches: "site.com/hello-world" 
/     matches: "site.com/hello-world/" 
([a-z0-9,-]+)\.html$ fails (which is the expected result) 

그래서 당신은 사용해야합니다 :

 
^[^/]+/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$ 
+0

^[^ /] ./ ([a-z0-9, -] +)/([a-z0-9, -] +). –

+0

그게 바로 당신이 원하는 것입니다 - 두 번째 문자열이 일치하지 않아야합니다 정규식 용어는 "정규식이 문자열에 대해 실패합니다"입니다. – Tomalak

+0

예, 두 번째 URL은 첫 번째 URL이 실패하지 않아야합니다. –

0

제 생각에 문제는 표현의 시작 부분에 욕심쟁이 match-all. *을 사용하는 것입니다.

조금 치트 :.

^.*(com|org|edu|net|gov)/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 
0

* 번째 경우 일치 "를 site.com/hello-world". 도메인 부분에 대해 더 구체적이어야합니다.

0

두 번째 경우. *는 예상보다 많이 일치합니다.

아마도 비 욕심 한정 기호로 대체 :.

^.*?/([a-z0-9,-]+)/([a-z0-9,-]+).html$ 
1

를 처음 URL를 들어 * 패턴의 부분 일치 "site.com"하지만 두 번째 URL 것이 site.com "일치/hello-world "를 참조하십시오.

당신이, 당신은 도메인 이름과 일치하는 패턴의 부분에 슬래시 문자를 허용하지 않을 수 있습니다 하나 개 이상의 폴더를 허용하지 않으려면 :

^[^/]*/([a-z0-9,-]+)/([a-z0-9,-]+)\.html$ 

(필자는 앞에 백 슬래시를 넣어 주 . html로 확장 이전 기간 마침표, 동안 \. 경기에 마침표 모든 문자와 일치)

편집 :.
당신은 두 URL을 허용하고 1 초 동안 폴더로 "안녕하세요 세계/테스트"를 사용하려면 , 폴더 부분에 슬래시 허용 :

^[^/]*/([a-z0-9,-/]+)/([a-z0-9,-]+)\.html$ 

당신은 페이지와 폴더와 "테스트/테스트"로 "안녕하세요 세계"를 사용하여 파일 이름 부분에 슬래시를 허용 할 경우 : 물론

^[^/]*/([a-z0-9,-]+)/([a-z0-9,-/]+)\.html$ 
+0

site /hello-world/test.html 및 site.com/hello-world/test/test.html 을 허용하고 싶은데 다른 페이지에 있습니다. –

+0

@Frozzare : 구체적으로 두 번째 url이 유효하지 않아야한다고 요청했습니다. 답변에 몇 가지 대안을 추가했습니다. – Guffa

+0

예, 첫 번째 URL 만 작동해야하기 때문에 –

0

아니 솔루션, 단지 제안 :이 정규 표현식을 실험 할 수 있도록 우수한 도구를 많이하고 실제로 당신이 그들을 작성 도움이됩니다.
저는 특히 Expresso을 좋아합니다. 명백하게 또한 The Regulator는 아주 좋은 것이다.

관련 문제