Expressão regular para corresponder a vários pares de parâmetro / valor de seqüência de consulta
-
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.
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?