使用字符串中的strpos查找坏词

时间:2016-09-07 07:55:20

标签: php

我有以下php代码在字符串中查找坏词。

停止发现第一个坏词并返回true。

坏词以逗号分隔列表的形式提供,转换为数组。

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = explode(",", $badWords);

function strpos_arr($string, $array, $offset=0) { // Find array values in string
    foreach($array as $query) {
        if(strpos($string, $query, $offset) !== false) return true; // stop on first true result for efficiency
    }
    return false;
}

strpos_arr($paragraph, $badWordsArray);

问题是如果提供的坏词是另一个词的一部分,它也会返回true。

我更喜欢使用 strpos 。 还请建议是否有更有效的方法来查找坏词。

2 个答案:

答案 0 :(得分:2)

尝试使用reqular表达式:

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = preg_split('/\s*,\s*/', $badWords, -1, PREG_SPLIT_NO_EMPTY);
var_dump($badWordsArray);

function searchBadWords($string, $array, $offset=0) { // Find array values in string
    foreach ($array as $query) {
        if (preg_match('/\b' . preg_quote($query, '/') . '\b/i', $string)) return true; // stop on first true result for efficiency
    }
    return false;
}

var_dump(searchBadWords($paragraph, $badWordsArray));

<强>解释

首先。我们想要正确地拆分$badWords字符串:

$badWordsArray = preg_split('/\s*,\s*/', $badWords, -1, PREG_SPLIT_NO_EMPTY);

这样我们就可以正确地将"sis, fur""sis , fur"甚至"sis , , fur"等字符串拆分为array('sis', 'fur')

然后我们使用\b元字符执行精确单词的正则表达式搜索。这意味着word-boundary就正则表达而言,就是 word-characted 非单词字符之间的位置

答案 1 :(得分:0)

只需在搜索字符串中包含空格。

$paragraph = "We have fur to sell";
$badWords = "sis, fur";
$badWordsArray = explode(",", $badWords);

function strpos_arr($string, $array, $offset=0) { // Find array values in string

$string = " ".$string." ";

foreach($array as $query) {
    $query = " ".$query." ";
    if(strpos($string, $query, $offset) !== false) return true; // stop on first true result for efficiency
}
return false;
}

strpos_arr($paragraph, $badWordsArray);