开发者

Swear filter case sensitive

开发者 https://www.devze.com 2023-03-27 18:55 出处:网络
I have a little problem with my function: function swear_filter($string){ $search = array( \'bad-word\',

I have a little problem with my function:

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

It should transform "bad-word" to "**" but the problem is the case 开发者_C百科sensivity

eg. if the user type "baD-word" it doesn't work.


The values in your $search array are not regular expressions.

First, fix that:

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

Then, you can apply the i flag for case-insensitivity:

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

You don't need the g flag to match globally (i.e. more than once each) because preg_replace will handle that for you.

However, you could probably do with using the word boundary metacharacter \b to avoid matching your "bad-word" string inside another word. This may have consequences on how you form your list of "bad words".

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

Live demo.


If you don't want to pollute $search with these implementation details, then you can do the same thing a bit more programmatically:

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

(I've not used the recent PHP lambda syntax because codepad doesn't support it; look it up if you are interested!)

Live demo.


Update Full code:

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


I think you mean

'/bad-word/i',


Do you even need to use regex?

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

makes the following assumptions.

1) $string contains characters acceptable in the current local

2) all contents of the $search array are lowercase

edit: 3) Entire string consists of bad word

I suppose this would only work if the string was split and evaluated on a per word basis.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号