一、panduan.php
<?php/**
* 判断文本中是否存在关键词
*/
function filter_text($text, $badstring){
$filter = explode('|', $badstring);
foreach ($filter as $key) {
if(strpos($text, $key) !== false){
return true;
}
}
return false;
}?>二、filter.php
<?php
$badstring="拦我|此内容|不允许";
?>三、index.php
<?php
require_once("panduan.php");
require_once("filter.php");
$biaoti="如果包含此内容就不能通过!";
if(filter_text($biaoti, $badstring)){
echo "对不起,你提示的内容包含“$*****”文字不能表,请删除“此内容”文字后再提交!";
exit();
}
?>以上代码能正确拦截事先设置好的关键词,但怎么写才能提示是哪个关键词非法的?如果取得引号中的内容:“$*****”?请高手帮忙,谢谢!
<?php/**
* 判断文本中是否存在关键词
*/
function filter_text($text, $badstring){
$filter = explode('|', $badstring);
foreach ($filter as $key) {
if(strpos($text, $key) !== false){
return true;
}
}
return false;
}?>二、filter.php
<?php
$badstring="拦我|此内容|不允许";
?>三、index.php
<?php
require_once("panduan.php");
require_once("filter.php");
$biaoti="如果包含此内容就不能通过!";
if(filter_text($biaoti, $badstring)){
echo "对不起,你提示的内容包含“$*****”文字不能表,请删除“此内容”文字后再提交!";
exit();
}
?>以上代码能正确拦截事先设置好的关键词,但怎么写才能提示是哪个关键词非法的?如果取得引号中的内容:“$*****”?请高手帮忙,谢谢!
if(strpos($text, $key) !== false){
return $key;
}这里
if(filter_text($biaoti, $badstring)){
echo "对不起,你提示的内容包含“$*****”文字不能表,请删除“此内容”文字后再提交!";
exit();
}修改成$badstr=filter_text($biaoti, $badstring);if($badstr){
echo "对不起,你提示的内容包含“.$badstr.”文字不能表,请删除“此内容”文字后再提交!";
exit();
}大约如此.
$badstring = "/拦我|此内容|不允许/";
if (preg_match($badstring, $text, $matchs)){
echo $matchs[0]; //var_dump($matchs);
}
直接这样岂不快哉.
$start = microtime(true);
$text = '拦我';
$badstring = "/拦我|此内容|不允许/";
$count = 0;
for($i = 0; $i < 1000000; $i++) :
if (preg_match($badstring, $text, $matchs)){
$count += 1;
}
endfor;
$end = microtime(true);
printf ("Complete Num: %d Total Time: %f sec (Using preg_match())", $count ,$end - $start);
结果:Complete Num: 1000000 Total Time: 1.950609 sec (Using preg_match())$start = microtime(true);
$text = '拦我';
$badstring = "/拦我|此内容|不允许/";
$count = 0;
for($i = 0; $i < 1000000; $i++) :
if (strpos($badstring, $text)){
$count += 1;
}
endfor;
$end = microtime(true);
printf ("Complete Num: %d Total Time: %f sec (Using preg_match())", $count ,$end - $start);
结果:Complete Num: 1000000 Total Time: 0.383920 sec (Using preg_match())
结论:strpos 比 preg_math 要快很多!由此延伸结论,能用字符串处理函数解决的问题,尽量不要用正则!
首先把禁用词存在badword.txt中,每一词用换行符隔开//过滤词汇
function filter_badwords($text) {
if ($badwords = @file('badword.txt')) {
foreach ($badwords as $badword) {
$badword = trim($badword);
if ($badword != '') {
$badword = preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0([^0-9a-z\x80-\xff]|(&[#a-z0-9]+;)| )*', $badword);
$badword = preg_replace('/\(\[\^0-9a-z\\\x80-\\\xff\]\|\(&\[#a-z0-9\]\+;\)\| \)\*$/i', '', $badword);
$badword = preg_replace('/^\(\[\^0-9a-z\\\x80-\\\xff\]\|\(\&\[\#a-z0-9\]\+\;\)\| \)\*/i', '', $badword);
if (preg_match('/'.$badword.'/i', $text, $matches))
die('提交被拒绝!有禁用词汇“'.preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0<span style="color:#FFFFFF;display:none;">禁</span>', $matches[0]).'”。请返回检查。');
unset($matches);
}
}
}
}
首先把禁用词存在badword.txt中,每一词用换行符隔开//过滤词汇
function filter_badwords($text) {
if ($badwords = @file('badword.txt')) {
foreach ($badwords as $badword) {
$badword = trim($badword);
if ($badword != '') {
$badword = preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0([^0-9a-z\x80-\xff]|(&[#a-z0-9]+;)| )*', $badword);
$badword = preg_replace('/\(\[\^0-9a-z\\\x80-\\\xff\]\|\(&\[#a-z0-9\]\+;\)\| \)\*$/i', '', $badword);
$badword = preg_replace('/^\(\[\^0-9a-z\\\x80-\\\xff\]\|\(\&\[\#a-z0-9\]\+\;\)\| \)\*/i', '', $badword);
if (preg_match('/'.$badword.'/i', $text, $matches))
die('提交被拒绝!有禁用词汇“'.preg_replace('/[0-9a-z]|[\x80-\xff]{3}/iU', '$0<span style="color:#FFFFFF;display:none;">禁</span>', $matches[0]).'”。请返回检查。');
unset($matches);
}
}
}
}