Reemplazo de cadena condicional de PHP

Estoy tratando de reemplazar el ~ en | entre el [ ] en el siguiente caso:

 {stackoverflow is a [cool~great~fast] website ~ Find your answers [easily~quickly] on stackoverflow}. 

Nota: El texto entre [ ] puede ser multilínea.

He intentado varias expresiones regulares buth sin suerte.

Mi llamado más cercano en este momento es:

 $text = preg_replace("/\[(.*?)~(.*?)\]/i", "[$1|$2]", $text); 

Pero eso vuelve

 {stackoverflow is a [cool~great|fast] website ~ Find your answers [easily|quickly] on stackoverflow}. 

Necesita usar una expresión regular para encontrar todas las cadenas entre paréntesis y luego otra para reemplazar las ~ s en ellas. Puede usar preg_replace_callback para aplicar la expresión regular ~ -replacing a todas las subcadenas entre paréntesis como esta:

 preg_replace_callback('/\[[^\]]+\]/', function ($str) { return str_replace('~', '|', $str[0]); }, $my_string) 

más simple de lo que piensas

  echo preg_replace('/~(?=[^\[\]]*\])/s', '|', $a); 

? = es una aserción de búsqueda anticipada y dice “seguido de”. Es decir, “una tilde seguida de algunos que no son corchetes y luego un corchete de cierre” – esto solo coincide con ~ dentro de []

¿Cuáles son algunos ejemplos de las expresiones regulares que has usado? Mi pensamiento inmediato es que [] te está haciendo tropezar porque eso se usa para combinar clases de personajes. Si quiere hacer coincidir [o] como un literal, debe escapar con barras diagonales inversas: \ [o \].