Regex/PHP Reemplazar cualquier grupo de palabras repetitivas

¿Cómo puede coincidir

$string = "Foo Bar (Any Group - ANY GROUP Baz)";

Debería regresar como "Foo Bar (cualquier grupo - Baz)"

¿Es posible sin fuerza bruta como aquí? Reemplazar cadenas repetidas en una cadena ?

Editar: * El grupo podría consistir en 1-4 palabras, mientras que cada palabra podría coincidir [A-Za-z0-9\/\(\)]{1,30} * El separador siempre sería -

preguntado el 22 de mayo de 12 a las 21:05

Defina "grupo de palabras repetidas": ¿tiene que ser más de una palabra? ¿Cómo se define una palabra? ¿Qué separa las palabras? ¿A qué distancia pueden estar separados? -

Creo que 2 nociones son importantes para eso: - La longitud mínima del grupo repetido. - Los posibles separadores entre los grupos. -

El grupo podría constar de 1 a 4 palabras, mientras que cada palabra podría coincidir [A-Za-z0-9 \/\(\)]{1,30} -

Entonces, si un espacio puede ser parte de una palabra, ¿cómo se separan las palabras entre sí? -

Realmente no está buscando reemplazar una palabra, sino una frase completa que puede ser más difícil. -

1 Respuestas

Dejando el espacio fuera de la lista de caracteres de "palabra" permitidos, lo siguiente funciona para su ejemplo:

$result = preg_replace(
    '%
    (                 # Match and capture
     (?:              # the following:...
      [\w/()]{1,30}   # 1-30 "word" characters
      [^\w/()]+       # 1 or more non-word characters
     ){1,4}           # 1 to 4 times
    )                 # End of capturing group 1
    ([ -]*)           # Match any number of intervening characters (space/dash)
    \1                # Match the same as the first group
    %ix',             # Case-insensitive, verbose regex
    '\1\2', $subject);

contestado el 22 de mayo de 12 a las 21:05

¡Impresionante! Gracias por la explicación - Martin

Hola, necesito revivir este viejo hilo. ¿Sería posible ignorar posibles espacios en blanco? Entonces, ¿"(Cualquier grupo - CUALQUIER GRUPO Baz)" devolvería "(Cualquier grupo - Baz)"? - Martin

@Martin: Puedo pensar en una forma (fea) de cómo podría funcionar esto, pero sería un enfoque completamente diferente al que he usado aquí, así que creo que esto debería incluirse en una nueva pregunta para evitar confundir a la gente. - Tim Pietzcker

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.