У меня есть словарь ругательных слов в базе данных, и следующее отлично работает
preg_match_all("/\b".$f."(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
$t - это текст ввода и просто $f = preg_quote("punk"); "punk" из словаря базы данных, поэтому в этой точке цикла выражение выглядит следующим образом
preg_match_all("/\bpunk(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
preg_quote заменяет символы, например. # с \\#, чтобы выражение было экранировано, но когда словарь проверяет, например. "[email protected]" или "A$$" эти символы не обнаружены во входной строке с указанным выше выражением, у меня есть как a$$, так и [email protected] в словаре, но они не работают. Если я удаляю слово preg_quote() на слово, регулярное выражение недействительно, так как эти символы не экранируются.
Любые предложения о том, как я могу обнаружить "A$$"
Edit:
Итак, я думаю, что выражение, которое не работает как предполагалось, будет, например.
preg_match_all("/\bf\@ck(?:ing|er|es|s)?\b/si",$t,$m,PREG_SET_ORDER);
Что должно найти f @ck в $t
UPDATE:
Это мое использование, просто положите; если в $m есть совпадения, замените их на "\*\*\*\*", весь этот блок находится внутри цикла через каждое слово в словаре, $f - словарное слово, а $t - это вход
$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:
Вот, var_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:
Это происходит только тогда, когда слова заканчиваются символом. Я тестировал "a$$hole" и его штраф, но "A$$" не работает.
ДРУГОЕ ОБНОВЛЕНИЕ:
Попробуйте эту упрощенную версию, $words - словарь смены словаря
$words = array("a$$","asshole","a$$hole","[email protected]","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);
}
В результате я должен увидеть "Input whatever you feel like here eg. \*\*\*".