Регулярное выражение символов 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"

ОБНОВЛЕНИЕ: Это происходит только тогда, когда слова заканчиваются символом. Я проверял "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. \*\*\*" в следствии.

3 ответа

Не может быть сделано

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

  • ꜰᴜᴄᴋ - это U+A730.1D1C.1D04.1D0B, "\N{МАЛЕНЬКИЙ КАПИТАЛ БУКВЫ ЛАТИНСКОГО БУКВА F} \ N {МАЛЕНЬКИЙ КАПИТАЛ БУКВЫ БУКВЫ ЛАТИНСКИЙ C} \ N {МАЛЕНЬКИЙ КАПИТАЛ БУКВЫ ЛАТИНСКОГО БУКВЫ K} \ N {МАЛЕНЬКИЙ КАПИТАЛ ЛАТИНСКОГО БУКВЫ K}" "
  • ᶠᵘᶜᵏ - это U+1DA0.1D58.1D9C.1D4F, "\N{ПИСЬМО МОДИФИКАТОРА МАЛЕНЬКОЕ F} \ N {ПИСЬМО МОДИФИКАТОРА МАЛЕНЬКОЕ U} \ N {ПИСЬМО МОДИФИКАТОРА МАЛЕНЬКОЕ C} \ N {ПИСЬМО МОДИФИКАТОРА МАЛЕНЬКОЕ K}"
  • равен U+1D4BB.1D4CA.1D4B8.1D4C0, "\N{МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ F} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ U} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ C} \ N {МАТЕМАТИЧЕСКИЙ СКРИПТ МАЛЫЙ K}"
  • равен U+1D58B.1D59A.1D588.1D590, "\N{МАТЕМАТИЧЕСКАЯ БОЛЬШАЯ ФРАКТУРА МАЛЫЙ F} \ N {МАТЕМАТИЧЕСКАЯ БОЛЬШАЯ ФРАКТУРА МАЛЫЙ U} \ N {МАТЕМАТИЧЕСКАЯ БОЛЬШАЯ ФРАКТУРА МАЛЫЙ C} \ N {МАТЕМАТИЧЕСКАЯ БОЛЬШАЯ ФРАКТУРА МАЛЕНЬКАЯ"
  • равно U+1D4D5.1D4B0.1D49E.1D4A6, "\N{МАТЕМАТИЧЕСКИЙ ЗАГЛАВНЫЙ КАПИТАЛ F} \ N {МАТЕМАТИЧЕСКИЙ КАПИТАЛ СЦЕНАРИИ U} \ N {МАТЕМАТИЧЕСКИЙ КАПИТАЛ СЦЕНАРИИ C} \ N {МАТЕМАТИЧЕСКИЙ КАПИТАЛ} КАПИТАЛ
  • Ⓚ ⓤ ⓒ ⓚ - это U+24D5.24E4.24D2.24DA, "\N{ЗАКРЫТЫЙ ЛАТИНСКИЙ МАЛЕНЬКИЙ БУКВЫ F} \ N {ЗАКРЫТЫЙ ЛАТИНСКИЙ МАЛЕНЬКИЙ БУКВЫ U} \ N {ЗАКРЫТЫЙ ЛАТИНСКИЙ МАЛЕНЬКИЙ БУКВЫ C} \ N {ЗАКРЫТЫЙ ЛАТИНСКИЙ МАЛЕНЬКИЙ БУКВ K}"
  • Γ̵ ᏟᏦ - это U+393.335.10335.13DF.13E6, "\N{ГРЕЧЕСКАЯ ГАММА ПИСЬМА ГРЕЧЕСКОГО КАПИТАЛА} \ N {ОБЪЕДИНЕНИЕ КОРОТКОГО ХОДА} \ N {GOTHIC LETTER QAIRTHRA}\N{CHEROKEE LETTER TLI}\N{CHEROKEE '
  • ƒμɕѤ - это U+192.3BC.255.464, "\N{МАЛЕНЬКОЕ ПИСЬМО F С КРЮЧКОМ} \ N {ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО МУ} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ C С КУРЛОМ} \ N {ПИСЬМО С КИРИЛЛИЧЕСКИМ КАПИТАЛОМ IOTIFIED E}"
  • Г̵ЦСК - это U+413.335.426.421.41A, "\N{ПИСЬМО С КИРИЛЛИЧЕСКИМ КАПИТАЛОМ} \ N {СОКРАЩЕНИЕ СОКРАЩЕНИЯ КОРОТКОГО ХОДА} \ N {ЦИРИЛЛИЧЕСКИЙ БУКВЫ TSE} \ N {ПИСЬМО С КИРИЛЛИЧЕСКИМ КАПИТАЛОМ}} \ N {КИРИЛЛИЧЕСКИЙ КАПИТАЛ }"
  • ғᵾȼƙ - это U+493.1D7E.23C.199, "\N{ПИСЬМО МАЛЕНЬКОГО БУКВЫ С МЯГКИМ ЛИЦОМ} \ N {МАЛЕНЬКИЙ КАПИТАЛ ПИСЬМА ЛАТИНЫ U С ХОДОМ} \ N {МАЛЕНЬКОЕ БУКВА ЛАТИНА C С ПИСЬМОМ} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНЫ K С КРЮКОМ} "
  • ϜυϚΚ - это U+3DC.3C5.3DA.39A, "\N{ГРЕЧЕСКАЯ ПИСЬМО ГРЕЧЕСКОГО ПИСЬМА} \ N {ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО}} \ N {ГРЕЧЕСКАЯ ПИСЬМО ГРЕЧЕСКОГО ПИСЬМА} \ N {ГРЕЧЕСКОЕ КАПИТАЛЬНОЕ ПИСЬМО КАППА}"
  • ЖↃU ᆿ - это U+416.2183.55.11BF, "\N{КИРИЛЛИЧЕСКАЯ КАПИТАЛЬНАЯ БУКВА ZHE}\N{РИМСКАЯ ЦИФРОВАЯ ОБРАТНАЯ СТОРОНА} \ N {ЛАТИНСКАЯ БУКВНАЯ БУКВА U} \ N {HANGUL JONGSEONG KHIEUKH}"
  • ʞɔnɟ - это U+29E.254.6E.25F, "\N{МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ ПЕРЕКЛЮЧЕНО K} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ ОТКРЫТО O} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ N} \ N {ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО БЕСПЛАТНО J С ИНСУЛЬТОМ}"

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

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

00 ʞ ʞ, F ᵾ ⒞ K, K ⓒ ⒡ K, K, ∞ ∞ Ϛ k, f  Ꮯ K, ⓕ oo ɔ ⓚ, ɟ ⒰ ¢ K,   ȼ,  Ù ȼ ⒦, f  ⒞ ƙ, F  ᶜ, F ∞, Ꮯ @ ᵘ F F F ¢ ¢ o Ꮯ υ o o υ υ υ υ υ U U U U U U U U U U Ж Ж Ж Ж Ж Ж F F k, ƒ  C ƙ, ғ 00 ɔ Ѥ, ƒ U c ᴋ,  ∞ Ꮶ ⓒ, ꜰ  ᴄ ⒦,  ⒰ Ꮯ Ѥ, ꜰ ᴜ  ⒦, F   ʞ, f 00, С u K K, f  ɔ Κ, f μ Ↄ K, ɟ  c ʞ, f  Ↄ, F μ ¢, ᆿ  ᴄ ⒦, Κ ¢ oo ɟ, ᶠ μ ᶜ Ѥ, ᶠ ⓤ Ꮯ Ж,  ⒞ ᵘ F, F @ C ⓚ, Ѥ ᴄ u F, ⒡ ᵾ C k, ƒ μ ᶜ ᴋ, F  C, f ᵘ ¢ ᵏ, ᆿ 00, υ υ ȼ K, Ϝ  ȼ K,  oo ɕ ᴋ, ғ  Ꮯ ᴋ, ꜰ n  K, ꜰ μ Ϛ K, F ∞ ȼ, ⒡  Ↄ Κ, ƒ  ⒞, ᶠ U C Ꮶ, ᶠ υ Ↄ ƙ,   C, Ϝ U  Ѥ, Ϝ U Ↄ,  U ⒞ ᵏ, F @ C К, ғ ᴜ  ᴋ, ⒡ U  К, ɟ U * ᵏ, c с Κ, ғ U Ↄ, ƒ ⒰  ᵏ, ғ  * K,  n  ⓚ, ᶠ 00 С К, k k, ƙ c ᶠ ⒰,  ⒰ Ѥ, ꜰ ǔ ᴄ ⒦, F  Ↄ,   υ ꜰ,   * ᵏ,  00,, Κ C, ᶠ U K K, ꜰ   Κ, ɟ U ᶜ ⓚ,  ∞ ȼ ᴋ, ƒ U К ć, ƒ ƒ ȼ ȼ, ⒡ ∞ ɕ ɕ,  ᵘ  ᵏ, F U Ϛ ʞ, Ⓕ Ж,    Ↄ, Ϝ n * K,  oo c ⓚ, ƒ U ¢ ʞ, ƒ u C ʞ, K ¢ μ ⒡, ɟ ⒰ K ɔ, F U c k, F ⓚ ⓚ,  U ᴋ ɔ,   Ꮯ,    ⓚ, C C К, ɟ ᵾ * ⒦, ᶠ ᵘ ⒞ ⒦, ƒ ⒰ ᴄ ᵏ, ⒡ ⒰ С K,  ⒰ * ᴋ, ᆿ ∞ ʞ ɕ,  n * Ѥ, Ϝ μ ᴄ, k ć ᵘ ƒ,  ᵘ ɕ, ɟ Ꮶ ᴄ ᴄ,  ᵾ ⒞ ᵏ, ғ ᵘ  ᵏ,  ᵾ * Ѥ, F  Ꮯ K, ғ ⓤ  ᴋ, ƒ u ɕ, ƙ c ⒰ F,   ⓒ Κ, K ᶜ,, ɟ  c ⒦, ƒ @ c Κ, Ϝ ȼ Ḱ Ḱ, ᵘ ᵘ  ⒦, ɟ ᵾ Ѥ ¢, F  Ↄ, Ϝ ᴜ, Ϝ  ⒞,  U Ꮯ ʞ, υ υ ᵏ F, F ᵾ Ꮯ Κ, Ϝ ᵘ ⓒ ʞ,  ⓤ ᶜ ƙ, ᆿ  ⒞, f Ѥ Ѥ,  U  K, Ϝ ᴜ *, ꜰ @ ⓒ ʞ, ƒ u ⓒ, f U ⒞ k,  00 ᴄ Ѥ,  υ K K, F ᴜ ᴄ, ⓕ oo Ↄ ⓚ, ⒡ ᵘ ɕ, ⓕ υ ᴄ Κ, Ꮯ U Ꮯ,   Ꮯ Ꮶ,   Ć,  Ц ɕ К, f @ Ↄ ⓚ, ᴋ ᶜ U ꜰ,  ᴜ c ⒦, F ᵘ C,  00  Ꮶ, ꜰ 00  К, Ϝ  Ϛ ᵏ, F  c Ѥ, ⓕ oo Ↄ K, f ᵾ ᵏ ᵏ, ⓕ c c, c,, ⓕ   ƙ, ⓚ C n ғ, ɟ U ȼ,  00 K ȼ,   ᴄ, C C ¢ Ц k k, ¢, ¢, ¢ k k k k k Ж Ж Ж Ж Ж Ж Ж ƒ ƒ ⒦ ⒦ ⒦ ⒦ ⒦ C,, ƒ μ Ꮯ ƙ, ⓕ n ᴄ ⒦, ⓕ μ ⓒ,, ⒡ 00 ɕ,  ᴜ ᶜ, ᆿ Ù,, ⒦ ȼ U, k C ⓤ ᆿ, Ϝ n F ᵏ, ᴋ ȼ ᵾ ɟ, F  ȼ Ѥ, ғ ⒰ ȼ, f U Ж ⒞, F ῠ  ᵏ, F u  Κ, F 00 ȼ, ꜰ μ Ϛ Ꮶ, ᆿ   K, ⒡ n Ↄ Ж, F @  ƙ, ᶠ ὺ  К,  U C ᵏ, F U  ⒦,  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-z] чтобы отметить конец слова, чтобы исправить это.

preg_match_all("/\b".$f."(?:ing|er|es|s)?[^a-z]/si",$t,$m,PREG_SET_ORDER);
Другие вопросы по тегам