Символы preg_quote регулярного выражения не обнаруживаются

У меня есть словарь нецензурных слов в базе данных, и следующее отлично работает

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

$ t - это вводимый текст и просто $ f = preg_quote ("панк") ; «панк» взят из словаря базы данных, поэтому в этот момент в цикле выражение выглядит следующим образом

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

preg_quote заменяет символы, например. # с \\ # , чтобы выражение было экранировано, но когда словарь проверяет, например. "

У меня есть словарь ненормативной лексики в базе данных, и следующий код отлично работает

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

$ t - это входной текст и просто $ f = preg_quote ("punk") ; «панк» взят из словаря базы данных, поэтому на данном этапе цикла выражение выглядит следующим образом

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

preg_quote заменяет символы, например. # с \\ # , чтобы выражение было экранировано, но когда словарь проверяет, например. "

У меня есть словарь нецензурных слов в базе данных, и следующий код отлично работает

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

$ t - это вводимый текст, и просто $ f = preg_quote ("punk") ; «панк» взят из словаря базы данных, поэтому на данном этапе цикла выражение выглядит следующим образом

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

preg_quote заменяет символы, например. # с \\ # , чтобы выражение было экранировано, но когда словарь проверяет, например. " # с \\ # , чтобы выражение было экранировано, но когда словарь проверяет, например. " # с \\ # , чтобы выражение было экранировано, но когда словарь проверяет, например. "F @ CK " или " A $$ " эти символы не обнаруживаются во входной строке с указанным выше выражением, у меня есть и a $$ , и f @ck в словаре, но они не работают. Если я удалю preg_quote () в слове, регулярное выражение станет недействительным, поскольку эти символы не экранированы.

Любые предложения о том, как Я могу обнаружить "a $$" ???

Изменить:

Поэтому я предполагаю, что выражение, которое не работает должным образом, будет, например,

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

Что должно найти f @ck в $ t

ОБНОВЛЕНИЕ:

Это мое использование, проще говоря; если есть совпадения в $ 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);
}

ОБНОВЛЕНИЕ: Вот 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"

ОБНОВЛЕНИЕ: Это происходит только тогда, когда слова заканчиваются символом. Я протестировал «a $$ hole» , и все в порядке, но «$$» не работает.

ДРУГОЕ ОБНОВЛЕНИЕ: Попробуйте эту упрощенную версию, $ words - это временный словарь

$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);
}

. Я должен ожидать увидеть «Введите здесь все, что вам нравится, например. \ * \ * \ *» как результат.

35
задан tchrist 23 May 2011 в 16:05
поделиться