Expresión regular para que coincida con múltiples pares de parámetros / valores de cadena de consulta

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

  •  23-08-2019
  •  | 
  •  

Pregunta

A punto de trabajar a través de éste, pero pensó que alguien ya haya tenido que hacer frente, así que ...

Estoy buscando un elegante (y isapi reescribir compatibles) de expresiones regulares para buscar tres pares de parámetros / valores conocidos de una cadena de consulta, sin importar el orden, y también extraer todos los demás parámetros, mientras que despojar a los tres.

ABC = 123 def = 456 y ghi = 789 son todos conocidos, cuerdas fijas. Pueden aparecer en cualquier orden en la cadena de consulta, y pueden o pueden no ser los únicos parámetros, puede o no puede ser adyacente. Debe ser inteligente y no coincide con un aabc = 123 o ABC = 123 4 (por lo que cada buscados parámetro debe ser precedida y seguida por Y,?, #, O al final de la cadena) . La salida que quiero es una nueva cadena de consulta con los restantes params despojado a cabo.

Probablemente voy a tomar una puñalada en la lógica de la mañana, por lo que los puntos de bonificación si se puede resolver antes de tratar a continuación.

No hay solución correcta

Otros consejos

Creo expresiones regulares no deben ser utilizados para los problemas de este tipo. Sólo tokenize la cadena, y compara el nombre de cada parámetro a lo que busca.

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

Este es aproximada y no probado, pero presenta un concepto de trabajo (creo). Básicamente, busca a partir frontera, cadena literal, a continuación, poner fin a la frontera, en sustitución de cada uno con nula, a nivel mundial, y el uso | para dar opciones alternativas para cada uno.

Esto es lo que he llegado con:

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 creo que funciona. los lookAhead / búsqueda hacia atrás calificadores, (? <= y (? =, parecen ser la clave para permitir que mire para la abarca y ni? sin "consumirlo" echar a perder el próximo partido.

Uno de gotcha es que si la dirección URL anterior página sólo tiene las tres params, todavía terminar con un arrastre? sin parámetros en la URL redirigida, "/newpage.htm?". Actualmente tengo la intención de evitar que mediante el uso de un RewriteCond para que busque sólo en las direcciones URL con 4+ params antes de que esta incendios, y tienen una expresión regular partido sencillo para los que tienen exactamente el conjunto de reglas three..so completa sale a:

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]

(el $ 1 al final es para #additions a la url ... ¿Realmente lo necesito?) El otro problema es que supongo una URL de /oldpage.htm?abc=123&abc=123&abc=123 desencadenaría este , pero yo no veo ninguna forma fácil de solucionar esto, y no estoy demasiado preocupado sobre esto ..

Puede alguien pensar en una mejor manera de abordar esto, o ver cualquier otro problema?

Hay decodificadores cadena de consulta. Hay muchos temas conectados, sobre todo en este sitio.

Algunos de ellos.

Primera

Segunda

Y javadocs enlace para el decodificador Apache.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top