Чувствительный к регистру фильтр - PullRequest
0 голосов
/ 14 августа 2011

У меня есть небольшая проблема с моей функцией:

function swear_filter($string){
    $search = array(
        'bad-word',
    );
    $replace = array(
        '****',
    );
    return preg_replace($search , $replace, $string);
}

Она должна преобразовать "плохое слово" в "**", но проблема в чувствительности к регистру

например.если пользователь вводит «baD-слово», оно не работает.

Ответы [ 3 ]

5 голосов
/ 14 августа 2011

Значения в вашем массиве $search , а не регулярные выражения.

Сначала исправьте это:

$search = array(
    '/bad-word/',
);

Затем вы можете применить флаг i без учета регистра:

$search = array(
    '/bad-word/i',
);

Вам не нужен флаг g, чтобы соответствовать глобально (то есть, более одного раза), потому что preg_replace будет обрабатывать это для вас.

Однако, возможно, вы могли бы использовать метасимвол границы слова \b, чтобы избежать совпадения с вашей строкой "плохого слова" внутри другого слова . Это может повлиять на то, как вы формируете свой список «плохих слов».

$search = array(
    '/\bbad-word\b/i',
);

Live демо.


Если вы не хотите загрязнять $search этими деталями реализации, то вы можете сделать то же самое немного более программно:

$search = array_map(
   create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
   $search
);

(я не использовал недавний синтаксис лямбда PHP, потому что кодовая панель его не поддерживает; ищите его, если вам интересно!)

Живая демоверсия.


Обновление Полный код:

function swear_filter($string){
    $search = array(
        'bad-word',
    );

    $replace = array(
        '****',
    );

    // regex-ise input
    $search = array_map(
       create_function('$str', 'return "/\b" . preg_quote($str, "/") . "\b/i";'),
       $search
    );

    return preg_replace($search, $replace, $string);
}
0 голосов
/ 14 августа 2011

Вам даже нужно использовать регулярные выражения?

function swear_filter($string){
    $search = array(
        'bad-word',
    );
    if (in_array(strtolower($string), $search){
        return '****';
    }
    return $search
}

делает следующие предположения.

1) $ string содержит символы, допустимые в текущем локальном

2) все содержимое массива $ search в нижнем регистре

edit: 3) Вся строка состоит из плохого слова

Полагаю, это сработает, только если строка будет разбита и оценена для каждого слова.

0 голосов
/ 14 августа 2011

Я думаю, что вы имеете в виду

'/bad-word/i',
...