Regex / PHP Заменить любую повторяющуюся (но гибкую) группу слов

Как я могу сопоставить «Любая группа», повторенную как «ANY GROUP» или «ANYGROUP»,

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

поэтому они возвращаются как «Foo Bar (любая группа – база)»

Сепаратор всегда будет -

Это сообщение расширяет Regex / PHP Замените любую повторяющуюся группу слов

Это соответствует «Любая группа – ЛЮБАЯ ГРУППА», но не повторяется без пробела.

 $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); 

Это уродливо (как я сказал, это будет), но он должен работать:

 $result = preg_replace( '/((\b\w+)\s+) # One repeated word \s*-\s* \2 | ((\b\w+)\s+(\w+)\s+) # Two repeated words \s*-\s* \4\s*\5 | ((\b\w+)\s+(\w+)\s+(\w+)\s+) # Three \s*-\s* \7\s*\8\s*\9 | ((\b\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+) # Four \s*-\s* \11\s*\12\s*\13\s*\14\b/ix', '\1\3\6\10-', $subject); 

Решение до 6 слов:

 $result = preg_replace( '/ (\(\s*) (([^\s-]+) \s*?([^\s-]*) \s*?([^\s-]*) \s*?([^\s-]*) \s*?([^\s-]*) \s*?([^\s-]*)) (\s*\-\s*) \3\s*\4\s*\5\s*\6\s*\7\s*\8\s* /ix', '\1\2\9', $string); 

Проверьте это демо .