Expressão regular para corresponder a vários pares de parâmetro / valor de seqüência de consulta

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

  •  23-08-2019
  •  | 
  •  

Pergunta

Sobre a trabalhar através de um presente, mas pensei que alguém pode ter já teve que lidar com ele, então ...

Eu estou procurando um elegante (e isapi reescrever compatível) expressão regular para olhar para três pares de parâmetros / valores conhecidos em uma querystring, independentemente da ordem, e também extrair todos os outros parâmetros, enquanto que eliminasse os três.

ABC = 123 def = 456 e <> fortes ghi = 789 fortes são todos conhecidos, cordas fixas. Eles podem aparecer em qualquer ordem no querystring, e pode ou não ser os únicos parâmetros, podem ou não estar adjacentes. Ele deve ser inteligente e não corresponder a um aabc = 123 ou abc = 123 4 (para cada parâmetro procurou deve ser delimitada por &,?, #, Ou no final de string) . A saída que eu quero é uma nova string de consulta com os parâmetros restantes retirados.

Eu provavelmente vou tomar uma facada na lógica da manhã, por isso, pontos de bônus se você pode resolvê-lo antes de eu tentar então.

Nenhuma solução correta

Outras dicas

Eu acho que expressões regulares não devem ser usados ??para problemas deste tipo. Apenas tokenizar a corda, e comparar o nome de cada parâmetro para o que você está procurando.

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

Esta é aproximado e não testado, mas apresenta um trabalho (eu acho) conceito. Basicamente, olhar para iniciar fronteira, string literal, em seguida, fronteira final, substituindo cada um com nulo, a nível mundial, e usando | para dar opções alternativas para cada um.

Aqui está o que eu vim acima com:

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]

que eu acho que funciona. o lookAhead / lookbehind eliminatórias, (? <= e (? =, parecem ser a chave para permitir-me a olhar para o abrangente e ou? sem "consumi-lo" para atrapalhar o próximo jogo.

Uma pegadinha é que, se o velho página url só tem três parâmetros, eu ainda acabar com uma fuga? sem parâmetros na URL redirecionada "/newpage.htm?". Atualmente estou planejando para evitar que, usando um RewriteCond para apenas olhar para urls com 4+ params perante este incêndios, e ter uma regex jogo mais simples para aqueles com exatamente three..so o conjunto de regras completo sai para:

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]

(US $ 1 no final é para #additions para a url ... eu realmente preciso disso?) A outra questão é Suponho que um url de /oldpage.htm?abc=123&abc=123&abc=123 provocaria este , mas eu não vejo nenhuma maneira fácil em torno disso, e não estou muito preocupado com isso ..

Alguém pode pensar em uma melhor maneira de abordar isso, ou ver quaisquer outras questões?

Existem decodificadores querystring. Há muitos temas conectados, especialmente neste site.

Alguns deles.

Primeira

Segundo

E javadocs ligação para apache decodificador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top