Intereting Posts

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

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

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 заменяет символы, например. # с \\# чтобы выражение было экранировано, но когда словарь проверяет, например. "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" 

UPDATE: Это происходит только тогда, когда слова заканчиваются символом. Я тестировал "a$$hole" и все нормально, но "a$$" не работает.

ДРУГОЕ ОБНОВЛЕНИЕ: попробуйте эту упрощенную версию, $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); } 

В результате я должен ожидать, что "Input whatever you feel like here eg. \*\*\*" .

Невозможно выполнить

Извините, но эту «проблему» действительно невозможно решить. Рассмотрим следующие:

  • ꜰᴜᴄᴋ является U + A730.1D1C.1D04.1D0B, "\ N {LATIN LETTER SMALL CAPITAL F} \ N {LATIN LETTER SMALL CAPITAL U} \ N {LATIN LETTER SMALL CAPITAL C} \ N {LATIN LETTER SMALL CAPITAL K}"
  • ᶠᵘᶜᵏ является U + 1DA0.1D58.1D9C.1D4F, "\ N {МОДИФИЦИРОВАННОЕ ПИСЬМО SMALL F} \ N {МОДИФИКАЦИОННОЕ ПИСЬМО SMALL U} \ N {МОДИФИКАЦИОННОЕ ПИСЬМО SMALL C} \ N {МОДИФИЦИРОВАННОЕ ПИСЬМО SMALL K}"
  • 𝒻𝓊𝒸𝓀 является U + 1D4BB.1D4CA.1D4B8.1D4C0, "\ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ F} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ U} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ C} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ К}"
  • 𝖋𝖚𝖈𝖐 является U + 1D58B.1D59A.1D588.1D590, "\ N {МАТЕМАТИЧЕСКИЙ БОЛЬШОЙ FRAKTUR SMALL F} \ N {МАТЕМАТИЧЕСКИЙ БЕЛЫЙ ФРАКТУР МАЛЕНЬКИЙ U} \ N {МАТЕМАТИЧЕСКИЙ БЛОК FRAKTUR SMALL C} \ N {МАТЕМАТИЧЕСКИЙ БЕЛЫЙ FRAKTUR SMALL K}"
  • 𝓕 𝒰 𝒞 𝒦 является U + 1D4D5.1D4B0.1D49E.1D4A6, "\ N {MATHEMATICAL BOLD SCRIPT CAPITAL F} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТНЫЙ КАПИТАЛ U} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТНЫЙ КАПИТАЛ C} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТНЫЙ КАПИТАЛ K}"
  • Ⓕ ⓤ ⓒ ⓚ является U + 24D5.24E4.24D2.24DA, "\ N {CIRCLED LATIN SMALL LETTER F} \ N {CIRCLED LATIN SMALL LETTER U} \ N {CIRCLED LATIN SMALL LETTER C} \ N {CIRCLED LATIN SMALL LETTER K}»
  • Γ̵ 𐌵 ᏟᏦ является U + 393.335.10335.13DF.13E6, "\ N {GREEK CAPITAL LETTER GAMMA} \ N {СОКРАЩЕНИЕ КОРОТКОГО ПЕРЕГОВОРА СТРОКА} \ N {ГОТОВОЕ ПИСЬМО QAIRTHRA} \ N {ЧЕРКОЕ ПИСЬМО TLI} \ N {CHEROKEE LETTER TSO}"
  • ƒμɕѤ – U + 192.3BC.255.464, "\ N {ЛАТИНСКАЯ МАЛЕНЬКАЯ ПИСЬМА F С КРЫШКОЙ} \ N {ГРЕЧЕСКОЕ МАЛОЕ ПИСЬМО MU} \ N {ЛАТИНСКОЕ МАЛОЕ ПИСЬМО C CURL} \ N {CYRILLIC CAPITAL LETTER IOTIFIED E}"
  • Г̵ЦСК является U + 413.335.426.421.41A, "\ N {CYRILLIC CAPITAL LETTER GHE} \ N {СОКРАЩЕНИЕ КОРОТКОГО ПЕРЕГОВОРА СТРОКИ} \ N {CYRILLIC CAPITAL LETTER TSE} \ N {CYRILLIC CAPITAL LETTER ES} \ N {CYRILLIC CAPITAL LETTER KA }»
  • ғᵾȼƙ является U + 493.1D7E.23C.199, "\ N {CYRILLIC SMALL LETTER GHE WITH STROKE} \ N {ЛАТИНСКОЕ МАЛОЕ КАПИТАЛЬНОЕ ПИСЬМО U С ТРОКОЙ} \ N {ЛАТИНСКОЕ МАЛОЕ ПИСЬМО C С ТРОКОМ} \ N {ЛАТИНСКОЕ МАЛОЕ ПИСЬМО K С HOOK} "
  • ϜυϚΚ является U + 3DC.3C5.3DA.39A, "\ N {GREEK LETTER DIGAMMA} \ N {GREEK SMALL LETTER UPSILON} \ N {GREEK LETTER STIGMA} \ N {GREEK CAPITAL LETTER KAPPA}"
  • ЖↃU ᆿ является U + 416.2183.55.11BF, "\ N {CYRILLIC CAPITAL LETTER ZHE} \ N {РОМАНСКОЕ ЧИСЛО ИЗОБРАЖЕНО ОДИН СТОЛ} \ N {LATIN CAPITAL LETTER U} \ N {HANGUL JONGSEONG KHIEUKH}"
  • ʞɔnɟ U + 29E.254.6E.25F, "\ N {LATIN SMALL LETTER TURNED K} \ N {LATIN SMALL LETTER OPEN O} \ N {ЛАТИНСКОЕ МАЛОЕ ПИСЬМО N} \ N {LATIN SMALL LETTER DOTLESS J WITH STROKE}"

Становится хуже

И если вы считаете, что это легко, просто попробуйте справиться со всеми из них:

𝓕 00 Ↄ ʞ, F ᵾ ⒞ K, K ⓒ ⓒ ⒡, 𝖋 𝖀 K 𝒸, ғ ∞ Ϛ k, f 𝓊 Ꮯ K, ⓕ oo ɔ ⓚ, ɟ ⒰ ¢ K, 𝒻 𝖚 ȼ 𝖐, 𝕱 Ù ȼ ⒦, f 𝒰 ⒞ ƙ, F 𐌵 ᶜ 𝕶, F ∞ 𝒞 Ж, 𝕱 @ Ꮯ 𝓀, ɟ ᵘ 𝒞 𝕶, F Ц ¢ 𝒦, f oo Ꮯ ʞ, 𝕱 oo ¢ Ж, 𝕱 υ ᶜ Κ, Ϝ ú * ʞ, ꜰ 𝖚 c K, ƒ ᵘ ȼ k, 𝖋 U ȼ 𝕶, Ж ɔ μ ƒ, F ⓤ ⒞ k, ƒ 𝖚 C ƙ, ғ 00 ɔ Ѥ, ƒ U c ᴋ, 𝕱 ∞ Ꮶ ⓒ, ꜰ 𝓊 ᴄ ⒦, 𝕱 ⒰ Ꮯ Ѥ, ꜰ ᴜ 𝒞 ⒦, F 𝒰 𝖈 ʞ, f 00 𝖈 𝓀, ғ u С K, f 𐌵 ɔ Κ, f μ Ↄ K, ɟ 𝖚 c ʞ, f 𝖚 Ↄ 𝖐, F μ ¢ 𝓀, ᆿ 𝖀 ᴄ ⒦, Κ ¢ oo ɟ, ᶠ μ ᶜ Ѥ, ᶠ ⓤ Ꮯ Ж, 𝒦 ⒞ ᵘ F, F @ C ⓚ, Ѥ ᴄ u F, ⒡ ᵾ C k, ƒ μ ᶜ ᴋ, F 𝒰 C 𝓀, f ᵘ ¢ ᵏ, ᆿ 00 𝒸 𝕶, ꜰ υ ȼ K, Ϝ 𝓊 ȼ К, 𝕱 oo ɕ ᴋ, ғ 𝒰 Ꮯ ᴋ, ꜰ n 𝒸 K, ꜰ μ Ϛ К, F ∞ ȼ 𝖐, ⒡ 𐌵 Ↄ Κ, ƒ 𝖚 ⒞ 𝒦, ᶠ UC Ꮶ, ᶠ υ Ↄ ƙ, 𝓕 𝓊 C 𝓀, Ϝ U 𝒸 Ѥ, Ϝ U Ↄ 𝓀, 𝒻 U ⒞ ᵏ, F @ C К, ғ ᴜ 𝖈 ᴋ, ⒡ U 𝒸 K, ɟ U * ᵏ, 𝖋 C c Κ, ғ U Ↄ 𝕶, ƒ ⒰ 𝒞 ᵏ, ғ 𝖚 * K, 𝖋 n 𝕮 ⓚ, ᶠ 00 С К, 𝖋 Ц 𝒞 k, ƙ c ᶠ ᶠ, 𝕱 ⒰ Ѥ 𝖈, ꜰ ǔ ᴄ ⒦, F 𝒰 Ↄ 𝓀, 𝒦 𝖈 υ ꜰ, 𝖋 𝖚 * ᵏ, 𝖋 00 𝕮 Ж, Κ C 𝖚 𝖋, ᶠ U С K, ꜰ 𝖀 𝖈 Κ, ɟ U ᶜ ⓚ, 𝒻 ∞ ȼ ᴋ, ƒ U К ć, ƒ υ ȼ ᴋ, ⒡ ∞ Ж ɕ, 𝖋 ᵘ 𝖈 ᵏ, FU Ϛ ʞ, ⓕ 𐌵 𝕮 Ж, 𝕱 𝒰 𝓀 Ↄ, Ϝ n * K, 𝓕 oo c ⓚ, ƒ U ¢ ʞ, ƒ u C ʞ, K ¢ μ ⒡, ɟ ⒰ K ɔ, F U ck, F Ц 𝖈 Ⓚ, 𝒻 U ᴋ ɔ, 𝖋 𝖀 Ꮯ 𝒦, 𝒻 𐌵 𝖈 ⓚ, ⓕ 𝖚 C К, ɟ ᵾ * ⒦, ᶠ ᵘ ⒞ ⒞, ƒ ⒰ ᴄ ᵏ, ⒡ ⒰ С K, 𝓕 ⒰ * ᴋ, ᆿ ∞ ʞ ɕ, 𝒻 n * Ѥ, Ϝ μ ᴄ 𝒦, k ć ᵘ ƒ, 𝓕 ᵘ ɕ 𝖐, ɟ Ц Ꮶ ᴄ, 𝓕 ᵾ ⒞ ᵏ, ғ ᵘ 𝒸 ᵏ, 𝖋 ᵾ * Ѥ, F 𝖚 Ꮯ K, ғ ⓤ 𝕮 ᴋ, ƒ u ɕ 𝖐, ƙ c ⒰ F, 𝒰 ⓒ Κ, K ᶜ 𝕱 𝕱 𝖚 𝖚 𝖚 𝖚 ƒ ƒ 𝕱 𝕱 𝕱 𝕱 U Ꮯ ʞ, ƒ υ Ꮯ ᵏ, F ᵾ Ꮯ Κ, Ϝ ᵘ ⓒ ʞ, 𝓕 ⓤ ᶜ ƙ, ᆿ 𝒰 ⒞ 𝕶, f 𝖀 Ↄ Ѥ, 𝖋 U 𝒞 K, Ϝ ᴜ * 𝓀, ꜰ @ ⓒ ʞ, ƒ u ⓒ 𝒦, f U ⒞ k, 𝕱 00 ᴄ Ѥ, 𝒻 υ С 𝖋 𝖋 𝖋 𝖋 𝖋 𐌵 Ć 𝓀, 𝓕 Ц ɕ К, f @ Ↄ ⓚ, ᴋ ᶜ U ꜰ, 𝓕 ᴜ c ⒦, F ᵘ C 𝒦, 𝒻 00 𝖈 Ꮶ, ꜰ 00 𝖈 К, Ϝ 𝖚 Ϛ ᵏ, F 𐌵 c Ѥ, ⓕ oo Ↄ K, f ᵾ C ᵏ, ⓕ C c 𝒦, 𝓕 𐌵 c Ж, ⓕ 𝓊 𝒞 ƙ, ⓚ C n ғ, ɟ U ȼ 𝕶, 𝒻 00 K ȼ, 𝒻 𐌵 ᴄ 𝖐, 𝒻 C C 𝓀, 𝖋 Ц ¢ 𝓀, Ϝ ᵘ ck, ⒡ 𐌵 ¢ k, ƒ ⓤ ⓚ Ↄ, 𝒻 𐌵 𝕮 k, ƒ U Ↄ K, 𝓕 𝖀 ᴄ Ꮶ, ᆿ ⓤ 𝕮 ⒦, Ж ɔ U 𝖋, ƒ υ * ᴋ, ƒ 𝓊 𝒞 k, 𝓕 U С ⒦, 𝒻 𝖚 C Ж , ƒ μ Ꮯ ƙ, ⓕ n ᴄ ⒦, ⓕ μ ⓒ Ж, ⒡ 00 ɕ 𝖐, 𝕱 ᴜ ᶜ 𝒦, ᆿ Ù Ж 𝖈, ⒦ ȼ U 𝖋, k C ⓤ ᆿ, Ϝ n ȼ ᵏ, ᴋ ȼ ᵾ ɟ , F 𝖀 ȼ Ѥ, ғ ⒰ ȼ 𝒦, f U Ж ⒞, F ῠ 𝒸 ᵏ, F u 𝒸 Κ, F 00 ȼ 𝕶, ꜰ μ Ϛ Ꮶ, ᆿ 𝖀 𝒞 K, ⒡ n Ↄ Ж, F @ 𝒞 ƙ , ᶠ ὺ 𝒸 К, 𝒻 U C ᵏ, FU 𝖈 ⒦, 𝒻 00 Ↄ 𝕶, ᶠ 𝖚 c К, ғ ⓤ 𝒞 𝒦, 𝓕 ⓤ 𝖈 Κ, 𝒻 U 𝒸 𝒸, ⒡ 𝖀 ɔ Ꮶ, ⓚ ɔ 𝓊 f, 𝒻 U C K, F @ C Ѥ, ғ ᴜ С k, ɟ u * ƙ, ⓕ ᵾ ɕ 𝒦, 𝕱 00 ȼ K, 𝒻 υ 𝓀 𝖈, ƒ ⒰ * ʞ, ⓕ U Ↄ Ж, ꜰ U ȼ ƙ, ⒡ u С ⒦, ꜰ ᴜ 𝕮 Ќ, ᆿ μ 𝒞 ⒦, ⓕ @ ᴄ К, ᶠ υ ɔ ᵏ, ƙ Ↄ oo ꜰ, F ᴜ 𝕮 𝒦, 𝓕 ⒰ C ᵏ, 𝖋 U 𝒸 ƙ, ƒ ∞ C Ꮶ, 𝒻 ⒰ * K, 𝒻 u Ↄ ᴋ, ᆿ U ⓒ 𝓀, ᆿ U Ꮶ 𝕮, 𝓕 n 𝒦 𝖈, ƒ C C ƙ, ⒦ 𝖈 𝒰 ꜰ, K ¢ ᵘ f, 𝕱 ⒰ 𝖈 Ꮶ, 𝓀 ᴄ 00 𝖋, Ϝ U 𝒞 k, 𝕱 u ¢ ⒦, 𝕱 𝓊 * , ƒ 𝖀 С ᴋ, 𝒻 𝖀 C Ꮶ, 𝖋 @ 𝕮 Κ, ʞ С 𝖀 ᶠ, 𝖋 ᵾ Ϛ Ꮶ, ᶠ ⒰ ɔ 𝒦, F Ц ⒞ ʞ, ⒡ ⒰ К ɔ, ɟ υ ¢ 𝕶, Ѥ ȼ U ᆿ , 𝒻 ᴜ Ↄ ʞ, ғ 𝓊 * K, 𝒻 𝒰 ᴄ ʞ, F 𝖀 𝖈 ʞ, 𝒻 @ ȼ 𝒦, 𝒻 ⒰ * 𝖐, 𝒻 ᵾ ȼ 𝒦, F 𐌵 ¢ Ѥ, ꜰ ⓤ ƙ Ϛ, ⓕ 00 c ʞ , 𝕱 00 Ϛ K, 𝖋 υ Ↄ Κ, ꜰ μ ⓒ Ж, 𝒻 ᵘ Ϛ ʞ, Ϝ ᵘ Ↄ ᵏ, ⒡ ᵾ Ꮯ 𝒦, Ϝ ⒰ ȼ Ѥ, ƒ n 𝒞 Ѥ, ᆿ μ ⓒ k, 𝖋 Ц ɕ Κ , ғ μ 𝕮 Ѥ, f ⓤ Ꮯ 𝖐, ᵏ 𝕮 μ ƒ, ᵏ С 𝖚 𝓕, ᆿ ∞ 𝖈 𝒦, ғ ᵘ Ꮯ 𝓀, ƒ μ Ↄ k, f oo K ȼ, ɟ 𝓊 𝕶 С, ꜰ n 𝖈 K , 𝒻 00 𝖈 ᵏ, ᶠ μ ⓒ 𝓀, 𝖐 c ∞ Ϝ, ᆿ Ц Ć ⒦, 𝕱 ᵘ ᴄ 𝒦, F 00 𝕮 ⓚ, ᶠ @ ȼ К, …

И это еще не все: есть, по крайней мере, еще больше, когда они пришли. Вы видите, почему это принципиально невозможно?

Полное раскрытие

Потому что я не верю в безопасность через неясность, вот программа, которая генерирует все это:

 #!/usr/bin/env perl # # unifuck - print infinite permutations of fuck in unicode aliases # # Tom Christiansen <tchrist@perl.com> # Mon May 23 09:37:27 MDT 2011 use strict; use warnings; use charnames ":full"; use Unicode::Normalize; binmode(STDOUT, ":utf8"); our(@diddle, @fuck, %fuck); # initted down below while (my($f,$u,$c,$k) = splice(@fuck, 0, 4)) { $fuck{F}{$f}++; $fuck{U}{$u}++; $fuck{C}{$c}++; $fuck{K}{$k}++; } my @F = keys %{ $fuck{F} }; my @U = keys %{ $fuck{U} }; my @C = keys %{ $fuck{C} }; my @K = keys %{ $fuck{K} }; while (1) { my $f = $F[rand @F]; my $u = $U[rand @U]; my $c = $C[rand @C]; my $k = $K[rand @K]; for ($f,$u,$c,$k) { next if length > 1; next if /\p{EA=W}/; next if /\pM/; next if /\p{InEnclosedAlphanumerics}/; s/$/$diddle[rand @diddle]/ if rand(100) < 15; s/$/\N{COMBINING ENCLOSING KEYCAP}/ if rand(100) < 1; } if ( 0) { } elsif (rand(100) < 5) { $u = q(@) } elsif (rand(100) < 5) { $c = q(*) } elsif (rand(100) < 10) { ($c,$k) = ($k,$c) } elsif (rand(100) < 15) { ($f,$u,$c,$k) = reverse ($f,$u,$c,$k) } print NFC("$f $u $c $k\n"); } BEGIN { # ok to have repeats in each position, since they'll be counted only once # per unique strings @fuck = ( "\N{LATIN CAPITAL LETTER F}", "\N{LATIN CAPITAL LETTER U}", "\N{LATIN CAPITAL LETTER C}", "\N{LATIN CAPITAL LETTER K}", "\N{LATIN SMALL LETTER F}", "\N{LATIN SMALL LETTER U}", "\N{LATIN SMALL LETTER C}", "\N{LATIN SMALL LETTER K}", "\N{LATIN SMALL LETTER F}", "\N{INFINITY}", "\N{LATIN SMALL LETTER C}", "\N{LATIN SMALL LETTER K}", "\N{LATIN SMALL LETTER F}", "\N{LATIN SMALL LETTER O}\N{LATIN SMALL LETTER O}", "\N{LATIN SMALL LETTER C}", "\N{KELVIN SIGN}", "\N{LATIN SMALL LETTER F}", "\N{DIGIT ZERO}\N{DIGIT ZERO}", "\N{CENT SIGN}", "\N{LATIN CAPITAL LETTER K}", "\N{LATIN LETTER SMALL CAPITAL F}", "\N{LATIN LETTER SMALL CAPITAL U}", "\N{LATIN LETTER SMALL CAPITAL C}", "\N{LATIN LETTER SMALL CAPITAL K}", "\N{MODIFIER LETTER SMALL F}", "\N{MODIFIER LETTER SMALL U}", "\N{MODIFIER LETTER SMALL C}", "\N{MODIFIER LETTER SMALL K}", "\N{MATHEMATICAL SCRIPT SMALL F}", "\N{MATHEMATICAL SCRIPT SMALL U}", "\N{MATHEMATICAL SCRIPT SMALL C}", "\N{MATHEMATICAL SCRIPT SMALL K}", "\N{MATHEMATICAL BOLD FRAKTUR CAPITAL F}", "\N{MATHEMATICAL BOLD FRAKTUR CAPITAL U}", "\N{MATHEMATICAL BOLD FRAKTUR CAPITAL C}", "\N{MATHEMATICAL BOLD FRAKTUR CAPITAL K}", "\N{MATHEMATICAL BOLD FRAKTUR SMALL F}", "\N{MATHEMATICAL BOLD FRAKTUR SMALL U}", "\N{MATHEMATICAL BOLD FRAKTUR SMALL C}", "\N{MATHEMATICAL BOLD FRAKTUR SMALL K}", "\N{MATHEMATICAL BOLD SCRIPT CAPITAL F}", "\N{MATHEMATICAL SCRIPT CAPITAL U}", "\N{MATHEMATICAL SCRIPT CAPITAL C}", "\N{MATHEMATICAL SCRIPT CAPITAL K}", "\N{CIRCLED LATIN SMALL LETTER F}", "\N{CIRCLED LATIN SMALL LETTER U}", "\N{CIRCLED LATIN SMALL LETTER C}", "\N{CIRCLED LATIN SMALL LETTER K}", "\N{PARENTHESIZED LATIN SMALL LETTER F}", "\N{PARENTHESIZED LATIN SMALL LETTER U}", "\N{PARENTHESIZED LATIN SMALL LETTER C}", "\N{PARENTHESIZED LATIN SMALL LETTER K}", "\N{GREEK CAPITAL LETTER GAMMA}\N{COMBINING SHORT STROKE OVERLAY}", "\N{GOTHIC LETTER QAIRTHRA}", "\N{CHEROKEE LETTER TLI}", "\N{CHEROKEE LETTER TSO}", "\N{LATIN SMALL LETTER F WITH HOOK}", "\N{GREEK SMALL LETTER MU}", "\N{LATIN SMALL LETTER C WITH CURL}", "\N{CYRILLIC CAPITAL LETTER IOTIFIED E}", "\N{CYRILLIC CAPITAL LETTER GHE}\N{COMBINING SHORT STROKE OVERLAY}", "\N{CYRILLIC CAPITAL LETTER TSE}", "\N{CYRILLIC CAPITAL LETTER ES}", "\N{CYRILLIC CAPITAL LETTER KA}", "\N{CYRILLIC SMALL LETTER GHE WITH STROKE}", "\N{LATIN SMALL CAPITAL LETTER U WITH STROKE}", "\N{LATIN SMALL LETTER C WITH STROKE}", "\N{LATIN SMALL LETTER K WITH HOOK}", "\N{GREEK LETTER DIGAMMA}", "\N{GREEK SMALL LETTER UPSILON}", "\N{GREEK LETTER STIGMA}", "\N{GREEK CAPITAL LETTER KAPPA}", "\N{HANGUL JONGSEONG KHIEUKH}", "\N{LATIN CAPITAL LETTER U}", "\N{ROMAN NUMERAL REVERSED ONE HUNDRED}", "\N{CYRILLIC CAPITAL LETTER ZHE}", "\N{LATIN SMALL LETTER DOTLESS J WITH STROKE}", "\N{LATIN SMALL LETTER N}", "\N{LATIN SMALL LETTER OPEN O}", "\N{LATIN SMALL LETTER TURNED K}", "\N{FULLWIDTH LATIN CAPITAL LETTER F}", "\N{FULLWIDTH LATIN CAPITAL LETTER U}", "\N{FULLWIDTH LATIN CAPITAL LETTER C}", "\N{FULLWIDTH LATIN CAPITAL LETTER K}", ); @diddle = ( "\N{COMBINING GRAVE ACCENT}", "\N{COMBINING ACUTE ACCENT}", "\N{COMBINING CIRCUMFLEX ACCENT}", "\N{COMBINING TILDE}", "\N{COMBINING BREVE}", "\N{COMBINING DOT ABOVE}", "\N{COMBINING DIAERESIS}", "\N{COMBINING CARON}", "\N{COMBINING CANDRABINDU}", "\N{COMBINING INVERTED BREVE}", "\N{COMBINING GRAVE TONE MARK}", "\N{COMBINING ACUTE TONE MARK}", "\N{COMBINING GREEK PERISPOMENI}", "\N{COMBINING FERMATA}", "\N{COMBINING SUSPENSION MARK}", ); } 

\b проверяет границу слова. Согласно http://www.regular-expressions.info/wordboundaries.html :

Существуют три разных позиции, которые квалифицируются как границы слов:

  • Перед первым символом в строке, если первый символ является символом слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

«Символы слов» – буквы, цифры и символы подчеркивания, поэтому в строке «a $$» граница слова происходит после «a», а не после второго «$».

Вероятно, вам нужно явно указать символы, которые вы считаете «границами слов», используя класс (например, [- '"] ).

Теперь, когда вы сказали, что это не работает в конце слова, я вижу проблему. $@ или любые другие такие специальные символы не являются частью слова (поэтому \b ломает слово после «a» в случае «a $$», если за ним не следуют никакие другие буквы во входной строке). Я предлагаю использовать [^az] чтобы пометить конец слова, чтобы исправить его.

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