Регулярное выражение символов preg_quote не обнаружено - PullRequest
34 голосов
/ 23 мая 2011

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

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$$" ???

Edit:

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

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

Который должен найти f @ ck в $t

UPDATE:

Это мое использование, проще говоря; если в * 1035 есть совпадения, замените их на "\*\*\*\*", весь этот блок находится внутри цикла для каждого слова в словаре, $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","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 ]

182 голосов
/ 23 мая 2011

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

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

  • ꜰᴜᴄᴋ - это U + A730.1D1C.1D04.1D0B, "\ N {LATIN PETTER SMALL CAPITAL F} \ N {LATIN PETTER SMALL CAPITAL U} \ N {LATIN PETTER SMALL CAPITAL C} \ N {LATIN LETTER MALL CAPITAL 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 {МАТЕМАТИЧЕСКИЙ МОЛОДОЙ БОЛ K} "
  • ? ? ? ? - это U + 1D4D5.1D4B0.1D49E.1D4A6, "\ N {МАТЕМАТИЧЕСКИЙ ЗАГЛАВНЫЙ КАПИТАЛ F} \ N {МАТЕМАТИЧЕСКИЙ КАПИТАЛ КАПИТАЛА ПИСЬМЕНА U} \ N {МАТЕМАТИЧЕСКИЙ КАПИТАЛ КАПИТАЛА СЦЕНАРИИ C} \ N {MAT K} "
  • ⓕ ⓤ ⓒ ⓚ - это 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 TSO} "
  • ƒμɕѤ - это U + 192.3BC.255.464, "\ N {МАЛЕНЬКОЕ ПИСЬМО F С КРЮЧКОМ}} \ N {ГРЕЧЕСКОЕ МАЛЕНЬКОЕ ПИСЬМО МУ} \ N {МАЛЕНЬКОЕ ПИСЬМО С ЛАТИНСОМ C С КУРЛОМ} \ N {ПИСЬМО С КИРИЛЛИЧЕСКИМ КАПИТАЛОМ IOTIFIED E} «
  • Г̵ЦСК - это U + 413.335.426.421.41A, "\ N {ПИСЬМО КАПИТАЛЬНОГО КАПИТАЛА GHE} \ N {КОМБИНИРОВАНИЕ ПЕРЕКЛЮЧЕНИЯ КОРОТКОГО ХОДА} \ N {ЦИРИЛЛИЧЕСКОЕ ПИСЬМО КАПИТАЛА} \ N {ПИСЬМО КАПИТАЛЬНОГО КАПИТАЛА}} \ N {CYR КАПИТАЛЬНОЕ ПИСЬМО КА} "
  • ғᵾȼƙ - это 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 {LATIN CAPITAL LETTER U} \ N {HANGUL JONGSEONG KHIEUKH" "
  • ʞɔnɟ - это U + 29E.254.6E.25F, "\ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ ПЕРЕКЛЮЧЕНО K} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ ОТКРЫТЬ O} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ N} \ N {МАЛЕНЬКОЕ ПИСЬМО ЛАТИНСКОЙ БЕЗ ПИСЬМА С ХОДА} "

Хуже

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

? 00 Ↄ ʞ, F ᵾ ⒞ K, K ⓒ ⒡ ⒡, ? ? K ?, ғ ∞ Ϛ k, f ? Ꮯ K, o oo ɔ ⓚ, ɟ ⒰ ¢ K, ? ? ȼ ?, ? Ù ⒦ ⒦, f ? ⒞ ƙ, F ? ᶜ F, F ∞ ? Ж, ? @ Ꮯ ?, ɟ ᵘ ? ?, F ¢ ? f, f o Ꮯ ʞ, ? oo ¢ Ж, ? υ ᶜ Ϝ, Ϝ Ϝ * *, K ? c K, ƒ ᵘ ȼ k, ? U ȼ Ж, ɔ ɔ μ ƒ, 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 U * ᵏ, ? c c Κ, ғ U Ↄ ?, ƒ ⒰ ? ᵏ, ғ ? * K, ? n ? ⓚ, ᶠ 00 С К, ? ? ? k, ƙ c ᶠ ᶠ, ? ⒰ Ѥ ?, ⒦ ǔ ᴄ ⒦, F ? Ↄ ?, ? ? υ ꜰ, ? ? * ᵏ, ? 00 ? Ж, Κ C ? ?, ᶠ U С К, ꜰ ? ? Κ, ɟ U ᶜ ?, ? ∞ ȼ ᴋ, ƒ U ć, ƒ υ ⒡ ⒡, ⒡ ∞ ɕ ᵘ, ᵏ ᵘ ? ᵏ, F U Ϛ ʞ, ⓕ ? ? ?, ? ? ? Ϝ, * n * K, ? oo c ⓚ, ƒ U ¢ ʞ, ƒ u C ʞ, K ¢ μ ⒡, ɟ ⒰ K ɔ, F U c k, F ? ⓚ ⓚ, ? U ᴋ ɔ, ? ? Ꮯ ?, ? ? ? ⓚ, ⓕ ? C К, ɟ ᵾ * ⒦, ⒦ ᵘ ⒞ ⒦, ƒ ⒰ ᴄ ᵏ, ⒡ ⒰ С K, ? ⒰ * ᴋ, ᆿ ∞ ʞ ɕ, ? n * Ѥ, Ϝ μ ᴄ ?, k ć ƒ, ? ᵘ ɕ ?, ɟ Ꮶ Ꮶ ᴄ, ? ᵾ ⒞ ᵏ, ᵏ ᵘ ? ᵏ, ? ᵾ * Ѥ, F ? Ꮯ K, ғ ⓤ ? ᴋ, ƒ u ɕ ?, ƙ c ⒰ F, ? ? ⓒ Κ, K ᶜ ? ?, ɟ ? c ⒦, ƒ@ C Κ, Ϝ ȼ Ḱ Ḱ, ⒦ ᵘ ? ⒦, ɟ ᵾ Ѥ ¢, F ? Ↄ ?, Ϝ ᴜ ? ?, Ϝ ? ⒞ ?, ? U Ꮯ ʞ, ƒ υ Ꮯ ᵏ, F ᵾ Ꮯ Κ, Ϝ ᵘ ⓒ ʞ, Ƙ ⓤ ᶜ ƙ, ᆿ ? ⒞ ?, f ? Ↄ Ѥ, ? U ? K, Ϝ ᴜ * ?, ꜰ @ ⓒ ʞ, ƒ u ⓒ ?, f U ⒞ k, ? 00 ᴄ Ѥ, ? υ С K, F ᴜ ᴄ ?, ⓕ o ⓚ ⓚ, ⒡ ᵘ ɕ ?, ⓕ υ ᴄ Κ, ᆿ 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, ƒ ⓤ ⓚ Ↄ, ? ? ? к, ƒ U Ↄ K, ? ? ᴄ Ꮶ, ᆿ ⓤ ? ⒦, ɔ ɔ U ?, ƒ υ * ᴋ, ƒ ? ? k, ? U ⒦ ?, ? ? C,, ƒ μ Ꮯ ƙ, ⓕ n ᴄ ⒦, Ⓕ μ ⓒ,, ⒡ 00 ɕ ?, ? ᴜ ᶜ ?, ᆿ Ù ? ?, ⒦ ȼ U ?, k C ⓤ ᆿ, Ϝ n ȼ ᵏ, ᴋ ȼ ᵾ ɟ, F ? ȼ Ѥ, ғ ⒰ ȼ ?, f U ⒞ ⒞, F ῠ ? ᵏ, F u ? Κ, F 00 ȼ ?, ꜰ μ Ϛ Ꮶ, ᆿ ? ? K, ⒡ n Ↄ Ж, F @ ? ƙ, ᶠ ὺ ? К, U 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, 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}",
    );

}
3 голосов
/ 23 мая 2011

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

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

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

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

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

2 голосов
/ 23 мая 2011

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

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