Потому, что обратные слеши в строках, обрамлённых двойными кавычками, надо экранировать обратными слешами.
Либо так:
"/\\[[^\\]]*\\]/"
Либо так:
'/\[[^\]]*\]/'
Потому, что $outtext1 - НЕ строка, а массив, содержащий одну строку. О чём прямо написано в официальной русской документации: https://www.php.net/manual/ru/function.preg-match-all.php
array_key_exists($outtext1[0], $balles)
foreach($outttext as $outtext1){
if (array_key_exists($outtext1, $balles)){
.....
}
Выдает ошибку, что переменная $outtext1 не является строкой. Как быть?