只是在玩......(不要在生产中使用)
$data = array(
"i am nike world",
"i have n ikee shoes",
"i have nikeeshoes",
"i sell i-phone casings",
"i sell iphone-casings",
"you can have iphone",
"rapiD Garment factor",
"rosNIK Electronics",
"Buy you self N I K E",
"B*U*Y I*P*H*O*N*E BABY",
"My Phone Is not available");
$ban = array("nike","d&g","iphone");
示例 1:
$filter = new BrandFilterIterator($data);
$filter->parseBan($ban);
foreach ( $filter as $word ) {
echo $word, PHP_EOL;
}
输出 1
rapiD Garment factor
rosNIK Electronics
My Phone Is not available
示例 2
$filter = new BrandFilterIterator($data,true); //reverse filter
$filter->parseBan($ban);
foreach ( $filter as $word ) {
echo $word, " " , json_encode($word->getBan()) , PHP_EOL;
}
输出 2
i am nike world ["nike"]
i have n ikee shoes ["nike"]
i have nikeeshoes ["nike"]
i sell i-phone casings ["iphone"]
i sell iphone-casings ["iphone"]
you can have iphone ["iphone"]
Buy you self N I K E ["nike"]
B*U*Y I*P*H*O*N*E BABY ["iphone"]
使用的类
class BrandFilterIterator extends FilterIterator {
private $words = array();
private $reverse = false;
function __construct(array $words, $reverse = false) {
$this->reverse = $reverse;
foreach ( $words as $word ) {
$this->words[] = new Word($word);
}
parent::__construct(new ArrayIterator($this->words));
}
function parseBan(array $ban) {
foreach ( $ban as $item ) {
foreach ( $this->words as $word ) {
$word->checkMetrix($item);
}
}
}
public function accept() {
if ($this->reverse) {
return $this->getInnerIterator()->current()->accept() ? false : true;
}
return $this->getInnerIterator()->current()->accept();
}
}
class Word {
private $ban = array();
private $word;
private $parts;
private $accept = true;
function __construct($word) {
$this->word = $word;
$this->parts = explode(" ", $word);
}
function __toString() {
return $this->word;
}
function getTrim() {
return preg_replace('/\W/', '', $this->word);
}
function accept() {
return $this->accept;
}
function getBan() {
return array_unique($this->ban);
}
function reject($ban = null) {
$ban === null or $this->ban[] = $ban;
$this->accept = false;
return $this->accept;
}
function checkMetrix($ban) {
foreach ( $this->parts as $part ) {
$part = strtolower($part);
$ban = strtolower($ban);
$t = ceil(strlen(strtolower($ban)) / strlen($part) * 100);
$s = similar_text($part, $ban, $p);
$l = levenshtein($part, $part);
if (ceil($p) >= $t || ($t == 100 && $p >= 75 && $l == 0)) {
$this->reject($ban);
}
}
// Detect Bad Use of space
if (ceil(strlen($this->getTrim()) / strlen($this->word) * 100) < 75) {
if (stripos($this->getTrim(), $ban) !== false) {
$this->reject($ban);
}
}
return $this->accept;
}
}