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