У меня есть словарь ругательных слов в базе данных, и следующее отлично работает
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. \*\*\*"
.