다중 쿼리 문자열 매개 변수/값 쌍 일치하는 정규 표현식

StackOverflow https://stackoverflow.com/questions/895279

  •  23-08-2019
  •  | 
  •  

문제

이것을 통해 일하려고하지만 누군가가 이미 그것을 다루어야한다고 생각했을 것입니다.

나는 순서에 관계없이 쿼리 스트링에서 3 개의 알려진 매개 변수/값 쌍을 찾아서 우아한 (그리고 Isapi Rewrite Compatible) 정규 표현식을 찾고 있으며,이 세 가지를 제거하면서 다른 모든 매개 변수를 추출합니다.

ABC = 123 def = 456 그리고 GHI = 789 모두 알려진 고정 문자열입니다. 그것들은 쿼리 스트링에서 어떤 순서로 나타날 수 있으며, 유일한 매개 변수 일 수도 있고 인접 해있을 수 있습니다. 똑똑하고 일치하지 않아야합니다AABC = 123 또는 ABC = 1234 (따라서 검색 된 각 매개 변수는 &,?, #또는 문자열의 끝에 의해 괄호로 묶어야합니다). 내가 원하는 출력은 나머지 매개 변수가 제거 된 새 쿼리 문자열입니다.

나는 아마 아침에 논리를 찌르려고 할 것입니다. 그래서 내가 시도하기 전에 그것을 해결할 수 있다면 보너스 포인트.

올바른 솔루션이 없습니다

다른 팁

Regexes는이 유형의 문제에 사용해서는 안된다고 생각합니다. 문자열을 토큰 화하고 모든 매개 변수의 이름을 원하는 것과 비교하십시오.

s/(\?|\#|\&)(abc=123|def=456|ghi=789)(\&|\#|$)//g

이것은 대략적이고 테스트되지 않은 것이지만, 작동하는 개념을 제시합니다. 기본적으로, 시작 경계, 문자 문자열, 끝 테두리, 각각을 NULL, 전 세계적으로 교체하고 사용하여 | 각각에 대한 대체 옵션을 제공합니다.

다음은 다음과 같습니다.

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

내가 생각하는 것은 Lookahead/LookbeHind 예선은 (? <= 및 (? =,, 다음 경기를 엉망으로 만들지 않고, & 또는?를 찾을 수있는 열쇠 인 것 같습니다.

하나의 Gotcha는 이전 페이지 URL에 세 가지 매개 변수 만 있으면 여전히 후행으로 끝나는 것입니까? 리디렉션 된 URL에 매개 변수가없는 "/newpage.htm?". 나는 현재 화재가 발생하기 전에 4 개 이상의 매개 변수가있는 URL 만 살펴보기 위해 재 작성제를 사용하여이를 피할 계획이며 정확히 3 개가있는 것들에 대해 더 간단한 매치 레지 독을 가지고 있습니다. 따라서 전체 규칙 세트가 나옵니다.

RewriteCond URL ^/oldpage.htm\?([^#]\*=[^#]\*&){3,}[^#]\*=[^#]\*.\*

RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3  [I,RP,L]

RewriteRule ^/oldpage.htm\?(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)(.\*) /newpage.htm$1 [I,RP,L]

(마지막으로 $ 1은 URL에 대한 #additions의 것입니다 ... 정말로 필요합니까?) 다른 문제는 /oldpage.htm?abc=123&abc=123&abc=123의 URL이 이것을 트리거 할 것이라고 가정합니다. 그 주위에 쉬운 방법을 보지 못하고 너무 걱정하지 않습니다 ..

누구든지 이것에 접근하거나 다른 문제를 볼 수있는 더 좋은 방법을 생각할 수 있습니까?

쿼리 스트링 디코더가 있습니다. 특히이 사이트에는 많은 연결된 주제가 있습니다.

그들 중 일부.

첫 번째

그리고 Javadocs 링크 아파치 디코더의 경우.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top