Símbolos de pré-expressão de expressão regular não são detectados

Tenho um dicionário de palavrões no banco de dados e o seguinte funciona muito bem

preg_match_all("/\b".$f."(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);

$t é o texto de entrada e, simplesmente,$f = preg_quote("punk"); "punk" é do dicionário do banco de dados, portanto, neste ponto do loop, a expressão é a seguinte

preg_match_all("/\bpunk(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);

preg_quote substitui símbolos, por exemplo.# com\\# para que a expressão seja escapada, mas quando o dicionário estiver verificando, por exemplo."F@CK" ou"A$$" esses símbolos não são detectados na string de entrada com a expressão acima, eu tenho ambosa$$ ef@ck no dicionário, mas eles não funcionam. Se eu removerpreg_quote() na palavra, a expressão regular é inválida, pois esses símbolos não são escapado

Quaisquer sugestões sobre como detectar"a$$" ???

Editar

Então, acho que a expressão que não está funcionando conforme o esperado seria, por exempl

preg_match_all("/\bf\@ck(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);

O que deve encontrar f @ ck em$t

ATUALIZAR

Este é o meu uso, basta colocar; se houver correspondências em$m substitua-os por"\*\*\*\*", todo esse bloco está dentro de um loop através de cada palavra no dicionário,$f é a palavra do dicionário e$t é a entrada

$f = preg_quote($f);
preg_match_all("/\b$f(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
if (count($m) > 0) {
     $t = preg_replace("/(\b$f(?:ing|er|es|s)?\b)/si","\*\*\*\*\*",$t);
}

UPDATE: Eis que ovar_dump:

preg_quote($f) = string(5) "a\$\$"
$t = string(18) "You're such an a$"
expression = string(29) "/\ba\$\$(?:ing|er|es|s)?\b/si"

UPDATE: Isso só acontece quando as palavras terminam com um símbolo. Eu testei"a$$hole" e está tudo bem, mas"a$$" não funciona.

OUTRA ATUALIZAÇÃO: Experimente esta versão simplificada,$words ser um dicionário improvisado

$words = array("a$","asshole","a$hole","f@ck","f#ck","f*ck");
$text = "Input whatever you feel like here eg. a$";

foreach ($words as $f) {
   $f = preg_quote($f,"/");
   $text = preg_replace("/\b".$f."(?:ing|er|es|s)?\b/si",
                         str_repeat("*",strlen($f)),
                        $t);
}

Eu deveria esperar ver"Input whatever you feel like here eg. \*\*\*" como um resultado

questionAnswers(3)

yourAnswerToTheQuestion